我找不到正则表达式
I can't find out with regex
我正在尝试从歌曲中获取所有和弦并将其放入 HTML 元素中。我正在使用这个正则表达式
/(\W)(\s)( Chord )\s/
这个正则表达式没有找到我需要的所有和弦。我做错了什么?
例如歌曲:
Intro: D G D G D G A G
D G
Klausei ko taip žiūriu
D G
Tavęs ausys neapgavo
D G
Aš kilnų tikslą turiu
D G
Sukišt liežuvį į burną tavo
A G D E G
Tai jokia nepagarba
A D E G
Ir ne kančia
A D E G
Ir ne bėda
A D E G
Greičiau likimo dovana
D D G
Mes pasirengę tegu
Mums gimsta dukros ir arba sūnūs
Arba visi kartu
Ir kuo daugiau, lai mums linksma būna
Tai beveik prabanga
Jokia bėda
Ir ne kančia
Tiesiog likimo dovana
正则表达式适用于不适用 'knowledgement' 的模式,我的意思是,正则表达式并不知道 Chorus 或 url 或其他任何类型的模式。
但是你可以用你的模式知识定义一个正则表达式来捕捉你认为属于你的模式的东西。
在这种情况下,您想要捕获和弦,它似乎是 A-G 范围内的大写单个字母或 de 相同范围内的大写-小写字母后跟字母 m。
可能两边都有空格。
因此,您可以定义此正则表达式:
/(?<=\s)([ABCDEFG]|Am|Bm|Cm|Dm|Em|Gm)(?=\s)/gm
这意味着 (?<=\s)
: 在模式的开头寻找 \spaces 但不要捕获它们。
然后 ([ABCDEFG]|Am|Bm|Cm|Dm|Em|Gm)
: 查找集合 [ABC...G] 中的一个字母或组合 Am 或 Bm 或...
然后 (?=\s)
在模式末尾查找 \spaces(不捕获它们)。
https://regex101.com/r/iE1xN3/1
你也可以重新定义你的正则表达式,
/(?<=\s)([A-G]m?)(?=\s)/gm
同理,换种方式表示,其中([A-G]m?)
:意思是,在A...G范围内寻找一个字母,后面可以跟字母m。
https://regex101.com/r/iE1xN3/2
对于 javascript(不支持后视,您可以这样做:
/(\b)([A-G]m?)(?=\s)/gm
https://regex101.com/r/iE1xN3/3
感谢@stribizhev 的反馈)
我不知道你到底想用什么替换。
我正在使用:
\b([A-G])\b
表示分词,字母A-G,分词。
https://regex101.com/r/kG0kE5/1
这个方法和 mayo 的答案的一个问题是,如果你的歌词中有单词 "A"。
我可能会编写一个程序,逐行确定整行是否只有和弦,然后只处理这些行。
例如:
很久很久以前,我仍然记得那首音乐曾经让我微笑。
大多数解决方案最终会在 "A long" 中选择 "A" 并将其识别为和弦。
您可以使用这样的正则表达式来匹配 "line" 的相关部分与和弦(使用多行 m
和全局 g
修饰符)。
这适用于选择具有一个或多个 "Chords" 的部分(减少误报情况):
\b(?:([A-G]m?) *)+$
在线尝试正则表达式here
NB:请注意,在线解决方案会正确跳过诸如 A first letter of the alphabet
之类的行,但作为 警告 它匹配尾随 A-G
(这在歌词中是不可能的事件)。
在php代码中:
$re = "/\b(?:([A-G]m?) *)+$/m";
$str = "Intro: D G D G D G A G\n\nD G\nKlausei ko taip žiūriu\nD G\nTavęs ausys neapgavo\nD G\nAš kilnų tikslą turiu\nD G\nSukišt liežuvį į burną tavo\nA G D E G\nTai jokia nepagarba\nA D E G\nIr ne kančia\nA D E G\nIr ne bėda\nA D E G\nGreičiau likimo dovana\n\nD D G \n\nMes pasirengę tegu\nMums gimsta dukros ir arba sūnūs\nArba visi kartu\nIr kuo daugiau, lai mums linksma būna\n\nTai beveik prabanga\nJokia bėda\nIr ne kančia\nTiesiog likimo dovana";
preg_match_all($re, $str, $matches);
print_r($matches[0]);
输出:
Array
(
[0] => D G D G D G A G
[1] => D G
[2] => D G
[3] => D G
[4] => D G
[5] => A G D E G
[6] => A D E G
[7] => A D E G
[8] => A D E G
[9] => D D G
)
我正在尝试从歌曲中获取所有和弦并将其放入 HTML 元素中。我正在使用这个正则表达式
/(\W)(\s)( Chord )\s/
这个正则表达式没有找到我需要的所有和弦。我做错了什么?
例如歌曲:
Intro: D G D G D G A G
D G
Klausei ko taip žiūriu
D G
Tavęs ausys neapgavo
D G
Aš kilnų tikslą turiu
D G
Sukišt liežuvį į burną tavo
A G D E G
Tai jokia nepagarba
A D E G
Ir ne kančia
A D E G
Ir ne bėda
A D E G
Greičiau likimo dovana
D D G
Mes pasirengę tegu
Mums gimsta dukros ir arba sūnūs
Arba visi kartu
Ir kuo daugiau, lai mums linksma būna
Tai beveik prabanga
Jokia bėda
Ir ne kančia
Tiesiog likimo dovana
正则表达式适用于不适用 'knowledgement' 的模式,我的意思是,正则表达式并不知道 Chorus 或 url 或其他任何类型的模式。 但是你可以用你的模式知识定义一个正则表达式来捕捉你认为属于你的模式的东西。
在这种情况下,您想要捕获和弦,它似乎是 A-G 范围内的大写单个字母或 de 相同范围内的大写-小写字母后跟字母 m。 可能两边都有空格。
因此,您可以定义此正则表达式:
/(?<=\s)([ABCDEFG]|Am|Bm|Cm|Dm|Em|Gm)(?=\s)/gm
这意味着 (?<=\s)
: 在模式的开头寻找 \spaces 但不要捕获它们。
然后 ([ABCDEFG]|Am|Bm|Cm|Dm|Em|Gm)
: 查找集合 [ABC...G] 中的一个字母或组合 Am 或 Bm 或...
然后 (?=\s)
在模式末尾查找 \spaces(不捕获它们)。
https://regex101.com/r/iE1xN3/1
你也可以重新定义你的正则表达式,
/(?<=\s)([A-G]m?)(?=\s)/gm
同理,换种方式表示,其中([A-G]m?)
:意思是,在A...G范围内寻找一个字母,后面可以跟字母m。
https://regex101.com/r/iE1xN3/2
对于 javascript(不支持后视,您可以这样做:
/(\b)([A-G]m?)(?=\s)/gm
https://regex101.com/r/iE1xN3/3
感谢@stribizhev 的反馈)
我不知道你到底想用什么替换。
我正在使用:
\b([A-G])\b
表示分词,字母A-G,分词。
https://regex101.com/r/kG0kE5/1
这个方法和 mayo 的答案的一个问题是,如果你的歌词中有单词 "A"。
我可能会编写一个程序,逐行确定整行是否只有和弦,然后只处理这些行。
例如:
很久很久以前,我仍然记得那首音乐曾经让我微笑。
大多数解决方案最终会在 "A long" 中选择 "A" 并将其识别为和弦。
您可以使用这样的正则表达式来匹配 "line" 的相关部分与和弦(使用多行 m
和全局 g
修饰符)。
这适用于选择具有一个或多个 "Chords" 的部分(减少误报情况):
\b(?:([A-G]m?) *)+$
在线尝试正则表达式here
NB:请注意,在线解决方案会正确跳过诸如 A first letter of the alphabet
之类的行,但作为 警告 它匹配尾随 A-G
(这在歌词中是不可能的事件)。
在php代码中:
$re = "/\b(?:([A-G]m?) *)+$/m";
$str = "Intro: D G D G D G A G\n\nD G\nKlausei ko taip žiūriu\nD G\nTavęs ausys neapgavo\nD G\nAš kilnų tikslą turiu\nD G\nSukišt liežuvį į burną tavo\nA G D E G\nTai jokia nepagarba\nA D E G\nIr ne kančia\nA D E G\nIr ne bėda\nA D E G\nGreičiau likimo dovana\n\nD D G \n\nMes pasirengę tegu\nMums gimsta dukros ir arba sūnūs\nArba visi kartu\nIr kuo daugiau, lai mums linksma būna\n\nTai beveik prabanga\nJokia bėda\nIr ne kančia\nTiesiog likimo dovana";
preg_match_all($re, $str, $matches);
print_r($matches[0]);
输出:
Array
(
[0] => D G D G D G A G
[1] => D G
[2] => D G
[3] => D G
[4] => D G
[5] => A G D E G
[6] => A D E G
[7] => A D E G
[8] => A D E G
[9] => D D G
)