使用perl正则表达式查找哈希标记(#)

时间:2015-02-17 05:08:41

标签: regex perl escaping

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

2 个答案:

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

  

有三种不同的职位符合词边界:

     
      
  1. 在字符串中的第一个字符之前,如果第一个字符是   一个字符。
  2.   
  3. 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  4.   
  5. 字符串中的两个字符之间,其中一个是单词字符   而另一个不是一个字符。
  6.   

基本上,#符号不是单词字符。

如果不知道您的数据是什么样的,以下只是一个猜测:

([a-gA-G])([#b])(m)?