2013-06-28 4 views
0

Необходимо сопоставить BSC0 с BSC10 и "TOTAL". Но нижеследующее условие соответствует только BSC1 и BSC10. Чего не хватает? пытались с s/regex/m/regex/ вариации такжеPerl регулярное выражение в соответствии с числами

$currentRowHeader будет содержать одно слово без пробелов

if ($currentRowHeader =~ /BSC[0-10]|TOTAL/) { print "OK"} 

ответ

8

[...] является характер класса. Он может соответствовать только одному символу. Регулярные выражения не имеют понятий чисел - только цифр. Какой регулярное выражение говорит это

матч персонаж 0 к 1 (т.е. 0или1) или соответствовать 0.

Таким образом, он соответствует только одной двоичной цифре. Вы можете использовать

if ($currentRowHeader =~ /BSC(?:[0-9]|10)|TOTAL/) { print "OK" } 

Обратите внимание, что ?: не является необходимой, но это хорошая привычка, так как он подавляет ненужный capturing и, следовательно, ускоряет работу.

2

Черта в классе символов - это диапазон символов, а не значения. Попробуйте это:

if ($currentRowHeader =~ /BSC(10|\d)|TOTAL/) 

FYI \d означает «любую цифру» и идентична (с латинскими символами) для кодирования [0-9], но короче и легче читать.

Как некоторые педанты скажут вам, \d включает в себя нелатинские цифры, такие как символы на арабском и китайском языках для цифр, но это явно не имеет значения в контексте этого вопроса.

+2

Пожалуйста, не далее миф о том, что '\ d' ==' [0-9] 'Хотя это верно для многих случаев (строка содержит только символы ASCII, модификатор'/a' действует и т. Д.), он фактически соответствует любому символу, который считается символом Unicode. Например. эта арабская цифра 4: 'perl -Mutf8 -E'say" 4 "= ~/\ d /? «да»: «нет», « – amon

+1

». Разумеется, но в контексте этого вопроса, который явно использует английские номера, я сказал правду. Кроме того, \ d очень широко используется таким образом. Я бы стал полностью комфортно ходить в производство с этим регулярным выражением. – Bohemian