我正在使用perl正则表达式来解析音乐和弦名称,例如E#m
。我似乎无法让perl认出#
。尽管其他字符在字符串中工作正常,但它在存储在字符串中时也不起作用。我也尝试用反斜杠来逃避它。
重申:
my ($scale, $mod, $chord) = /\b([a-g])(\#|b|)\b/i ;
或
my $sharp = "#";
my ($scale, $mod, $chord) = /\b([a-g])($sharp|b|)\b/i ;
不起作用,但是
my $sharp = "n";
my ($scale, $mod, $chord) = /\b([a-g])($sharp|b|)\b/i ;
检测到n
答案 0 :(得分:1)
\b([a-g])(\#|b|)\b
^^
最后的\b
是罪魁祸首。在匹配a#
后,它会查找\b
与\b assert position at a word boundary (^\w|\w$|\W\w|\w\W)
不匹配的内容。所以\b
不能找到了(因为#
不是\w
的一部分,所以$
#
之后的word boundary
并不是\b
并且它失败了。删除最后\b([a-g])(#|b\b)
它的工作原理。或者
使用
n
https://www.regex101.com/r/rK5lU1/39
n$
匹配,因为\b
形成了一个单词边界,因此{{1}}正在匹配。
答案 1 :(得分:1)
这是http://www.regular-expressions.info/wordboundaries.html。
有三种不同的职位符合词边界:
- 在字符串中的第一个字符之前,如果第一个字符是 一个字符。
- 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
- 字符串中的两个字符之间,其中一个是单词字符 而另一个不是一个字符。
醇>
基本上,#符号不是单词字符。
如果不知道您的数据是什么样的,以下只是一个猜测:
([a-gA-G])([#b])(m)?