我无法找到正则表达式

时间:2015-10-21 12:05:59

标签: regex find

我正试图从一首歌中获取所有和弦并放入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

3 个答案:

答案 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
)