Regex 使用perl正则表达式查找哈希标记(#)
我正在使用perl正则表达式解析音乐和弦名称,例如Regex 使用perl正则表达式查找哈希标记(#),regex,perl,escaping,Regex,Perl,Escaping,我正在使用perl正则表达式解析音乐和弦名称,例如E#m。我似乎无法让perl识别。当存储在字符串中时,它也不起作用,尽管其他字符可以从字符串中正常工作。我也试着用反斜杠来逃避它 重申: my ($scale, $mod, $chord) = /\b([a-g])(\#|b|)\b/i ; 或 不工作,但是 my $sharp = "n"; my ($scale, $mod, $chord) = /\b([a-g])($sharp|b|)\b/i ; 检测n \b([a-g])(\#|b
E#m
。我似乎无法让perl识别
。当存储在字符串中时,它也不起作用,尽管其他字符可以从字符串中正常工作。我也试着用反斜杠来逃避它
重申:
my ($scale, $mod, $chord) = /\b([a-g])(\#|b|)\b/i ;
或
不工作,但是
my $sharp = "n";
my ($scale, $mod, $chord) = /\b([a-g])($sharp|b|)\b/i ;
检测n
\b([a-g])(\#|b|)\b
^^
你最后的\b
是罪魁祸首。匹配a#
后,它会查找\b
,而\b在单词边界(^\w | \w$| \w\w | \w\w)
,因此找不到\b
(因为#
不是\w
的一部分,所以#
之后的$
不是字边界
),它失败了。删除最后一个\b
就可以了。或者
使用
n
得到了匹配,因为n$
构成了单词边界,所以\b
得到了匹配。这是来自
有三种不同的位置可以作为单词边界:
([a-gA-G])([#b])(m)?
删除结束词边界并在组内使用。
\b([a-g])(|b\b)
my($scale,$mod)=/([a-g]+)([${sharp}b]*)/i;
\b([a-g])(#|b\b)
([a-gA-G])([#b])(m)?