我正试图从一首歌中获取所有和弦并放入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
答案 0 :(得分:1)
正则表达式适用于不具有“知识”的模式,我的意思是,正则表达式并不真正知道什么样的模式是合唱或网址或其他什么。 但是,您可以使用模式知识定义正则表达式,以捕获您认为属于模式的内容。
在这种情况下,你想要捕捉和弦,这些和弦似乎是A-G或de Upper-lower case在同一范围内后跟字母m的范围内的大写单字母。 可能两边都有空格。
所以,你可以定义这个正则表达式:
/(?<=\s)([ABCDEFG]|Am|Bm|Cm|Dm|Em|Gm)(?=\s)/gm
这意味着(?<=\s)
:在模式的开头寻找\ _sxt但不捕获它们。
然后([ABCDEFG]|Am|Bm|Cm|Dm|Em|Gm)
:寻找收集的一个字母[ABC ... G]或Am或Bm的组合或......
然后(?=\s)
在模式的末尾查找\ _空格(不捕获它们)。
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(不支持look-behind,你可以这样做:
/(\b)([A-G]m?)(?=\s)/gm
https://regex101.com/r/iE1xN3/3
感谢@stribizhev的反馈意见)
答案 1 :(得分:0)
我不知道你想要用什么来代替。
我正在使用:
\b([A-G])\b
这意味着分词,字母A-G,分词。
https://regex101.com/r/kG0kE5/1
这种方法的一个问题和mayo的答案是,如果你的歌词中包含单词“A”。
我可能会编写一个逐行的程序来确定整行是否只是和弦,并且只处理这些行。
例如:
很久很久以前,我仍然记得那种音乐是如何让我微笑的。
大多数解决方案最终会在“A long”中选择“A”并将其识别为和弦。
答案 2 :(得分:0)
你可以使用这样的正则表达式将“线”的相关部分与和弦(多线m
和全局g
修饰符)相匹配。
这可以选择具有一个或多个“和弦”的部分(减少误报情况):
\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
)