Regex, чтобы соответствовать 2 или нет? - PullRequest
1 голос
/ 12 января 2011

У меня есть это регулярное выражение, чтобы определить, содержит ли строка два подчеркивания:

\s*_{2}(\w+)

Любой пробел, два подчеркивания и затем слово. Оказывается, мне нужно знать также без подчеркивания, поэтому у меня есть:

\s*(\w+)

Необязательные пробелы, за которыми следует слово. Тогда я получаю группу 1, что мое слово. Все идет нормально.

Проблема в том, что действие, выполняемое при использовании двух подчеркиваний, практически идентично коду, когда подчеркивание не используется (за исключением того, что я поднимаю флаг)

if( s =~ uderscore ) { 
   takeGroup( 1 )
   yada yada 
   flag = true
} else if( s =~ noUnderscore { 
  takeGroup( 1 ) 
  yada yada 
   flag = false 
}

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

Ответы [ 2 ]

6 голосов
/ 12 января 2011

Вместо этого используйте это регулярное выражение:

\s*(_{2})?(\w+)

Затем просто проверьте наличие первой группы - если она есть, подчеркивания присутствовали.То, что было группой 1, станет группой 2.

3 голосов
/ 12 января 2011
\s*(__)?(\w+)

(__)? - необязательная группа из двух подчеркиваний.Обратите внимание, что слово будет теперь в группе 2 вместо 1. Вы можете использовать вместо этого группу без захвата (?:__), если вы не хотите менять нумерацию групп.

...