Regex 使用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

我正在使用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|)\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)?