我要做到以下几点:
1)检查文本行中的每个单词(本例中为吉他和弦)是否包含在RegEx中。所有单词/字符必须匹配。
2)如果是,我希望该行中的每个单词都成为一个链接,指向由该词本身定制的URL。
即,以下一行:
Am Bb C# Dadd9
Song lyrics here应该变成这样:
<a href="example.com/Am">Am</a> <a href="example.com/Bb">Bb</a> <a href="example.com/C#">C#</a> <a href="example.com/Dadd9">Dadd9</a>
Song lyrics here我的RegEx (每个和弦的音符和符号):
var lineRegex = /^\s*(?:(A|B|C|D|E|F|G|A#|C#|D#|F#|G#|Ab|Bb|Db|Eb|Gb){1}(?:m|\+|\-|aug|dim|add|b|#|1|2|3|4|5|6|7|8|9|0|\/)*\s*)+$/;下面是我为第二步所做的介绍:
var text = $('.input').val(); //get text
var lines = text.split('\n'); //split text into lines
var chords = lines.split(' '); //split lines into chords
var link = "http://www.example.com/";
$.each(chords, function(index, value) { //append link to chord
$('.output').append('<a href="' + link + value + '">' + value + '</a> ');
});我无法完成第一步。如何检查文本行是否只包含来自RegEx的注释和符号?
发布于 2017-09-19 17:09:55
回答
简介
我不知道什么和弦在吉他上是有效的/无效的,因为你没有指定那个信息(用明文-没有实现正则表达式),而且我们也不确定你的正则表达式是否有效,所以我的答案是基于我找到的随机图表(Google图像的第一个结果)。

正则表达式
样本1
基于这个图表,我创建了以下正则表达式
(?(DEFINE)
(?<chord_A>A(?:b(?:[679+]|sus)?|m[67]?|[689]|maj7|dim|\+|sus)?)
(?<chord_B>B(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
(?<chord_C>C(?:[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?)
(?<chord_D>D(?:b(?:[679+]|maj7|sus)?|[679]|m[67]?|maj7|dim|\+|sus)?)
(?<chord_E>E(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
(?<chord_F>F(?:[679+]|m[67]?|maj7|dim|sus|\#(?:[79]|m[67]|dim)?)?)
(?<chord_G>G(?:b(?:maj7|sus|[6+])?|[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?)
(?<chords>(?&chord_A)|(?&chord_B)|(?&chord_C)|(?&chord_D)|(?&chord_E)|(?&chord_F))
)
(?<link>\b(?&chords)(?=\s|$))在这个正则表达式中,我根据和弦的起始字母(例如A)来定义组。
此正则表达式通过定义每个chord的所有可能实例来工作(在每个组chord_X中,X表示chord,即C)。定义的组chords是每个和弦之间的比较(例如Chord A或Chord B或.)。最终的正则表达式使用(?<link>\b(?&chords)(?=\s|$))。这个正则表达式确保一个单词边界字符存在于和弦之前(每个字符以一个字母开头,因此不会失败),并且后面跟着一个空格或字符串$的末尾(\b不能在这里使用,因为有些注释包括单词边界字符,例如#,因此,为了正确捕获这些实例,我们使用空格或EOF)。
示例2
注意,由于图像中不存在C# (除非我是盲人),所以它不会从输入中捕获C#。您可以使用下面的regex来改变这种行为(它只是在?定义的组中的\#(?:m[67]?|dim)末尾添加了一个chord_C。
(?(DEFINE)
(?<chord_A>A(?:b(?:[679+]|sus)?|m[67]?|[689]|maj7|dim|\+|sus)?)
(?<chord_B>B(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
(?<chord_C>C(?:[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim)?)?)
(?<chord_D>D(?:b(?:[679+]|maj7|sus)?|[679]|m[67]?|maj7|dim|\+|sus)?)
(?<chord_E>E(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)
(?<chord_F>F(?:[679+]|m[67]?|maj7|dim|sus|\#(?:[79]|m[67]|dim)?)?)
(?<chord_G>G(?:b(?:maj7|sus|[6+])?|[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?)
(?<chords>(?&chord_A)|(?&chord_B)|(?&chord_C)|(?&chord_D)|(?&chord_E)|(?&chord_F))
)
(?<link>\b(?&chords)(?=\s|$))替换
<a href="example.com/${link}">${link}</a>该替换引用regex link中的命名捕获组。
结果
输入
Am Bb C# Dadd9
Song lyrics here样本1-输出
<a href="example.com/Am">Am</a> <a href="example.com/Bb">Bb</a> C# Dadd9
Song lyrics here样本2-输出
<a href="example.com/Am">Am</a> <a href="example.com/Bb">Bb</a> <a href="example.com/C#">C#</a> Dadd9
Song lyrics here编辑
由于javascript不使用PCRE regex,所以不能像上面所建议的那样使用命名捕获组,因此,不幸的是,我们将不得不使用一个漂亮的长且不可读的正则表达式,如下所示.
(\b(?:(?:A(?:b(?:[679+]|sus)?|m[67]?|[689]|maj7|dim|\+|sus)?)|(?:B(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)|(?:C(?:[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim)?)?)|(?:D(?:b(?:[679+]|maj7|sus)?|[679]|m[67]?|maj7|dim|\+|sus)?)|(?:E(?:b(?:[679+]|sus|m[67]?|maj7|dim)?|m[67]?|[679+]|maj7|dim|sus)?)|(?:F(?:[679+]|m[67]?|maj7|dim|sus|\#(?:[79]|m[67]|dim)?)?)|(?:G(?:b(?:maj7|sus|[6+])?|[679+]|m[67]?|maj7|dim|sus|\#(?:m[67]?|dim))?))(?=\s|$))以<a href="example.com/$1">$1</a>作为替代。
https://stackoverflow.com/questions/46304560
复制相似问题