2015-02-17 3 views
2

Я использую регулярные выражения perl для анализа музыкального имени аккорда, такого как E#m. Я не могу заставить perl распознать #. Он также не будет работать при сохранении в строке, несмотря на то, что другие символы отлично работают с строкой. Я также попытался убежать от него с обратной косой чертой.Поиск меток хэша (#) с использованием perl regex

Повторим:

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

Удалите конечную границу слова и использовать его внутри группы. '\ b ([a-g]) (# | b \ b)' – hwnd

+0

my ($ scale, $ mod) =/([a-g] +) ([$ {sharp} b] *)/i; – ssr1012

ответ

1
\b([a-g])(\#|b|)\b 

       ^^ 

Ваш \b в конце концов, это culprit.After соответствие a# он ищет \b, который не существует, как \b assert position at a word boundary (^\w|\w$|\W\w|\w\W) .so \b не может быть найден (потому что # не является частью \w так $ после # не является word boundary) и fails.Remove последний \b и works.Or

использование

\b([a-g])(#|b\b) 

https://www.regex101.com/r/rK5lU1/39

n получил соответствие, так как n$ образовывал границу слова, и поэтому \b получал матч.

1

Это http://www.regular-expressions.info/wordboundaries.html.

Есть три различных положения, которые квалифицируются как границы слова:

  1. До первого символа в строке, если первый символ слово символ.
  2. После последнего символа в строке, если последний символ является символом слова.
  3. Между двумя символами в строке, где один является символом слова , а другой не является символом слова.

В принципе, знак # не является символом слова.

зная, что заменяется без выглядит ваши данные, как, следующий только предположение:

([a-gA-G])([#b])(m)? 
Смежные вопросы