2013-10-25 3 views
1

Насколько я понимаю, круглые скобки увеличивают приоритет, позволяя жадному совпадению справа иметь преимущество над одним слева.Есть ли способ заставить приоритет в регулярном выражении (стиль perl)

Моя проблема в том, что я хочу поймать оставшееся значение левой руки, поэтому мне нужно заключить в скобки.

Есть ли другой способ поднять правую сторону вверх?

Пример текста:

some words  blah blah 123 

пример (неправильно) регулярное выражение:

/^([\w ]+)\s{2,}([\w ]+)\s{2,}([\w ]+)$/ 

мне нужно \ S +, чтобы быть жадными, чем [\ ш] + в хватая пространствах. Я мог бы исключить множественные пробелы в словах (совпадениях) с утверждением, но я все еще пытаюсь обойти их вокруг.

ответ

2

Вы никогда не должны пытаться смешивать пересекающиеся классы с жадными или не-жадные quantifers.
Вы должны знать, чего хотите, и вырезать различные границы.

# /^\s*(\w(?:[ ]?\w+)*)\s{2,}(\w(?:[ ]?\w+)*)\s{2,}(\w(?:[ ]?\w+)*)\s*$/ 

(?x)      # Modifier group, x = eXpanded 
^      # BOL 
\s*      # optional many whitespaces at start 
(\w (?: [ ]? \w+)*) # (1) word char start, word char end, optional 1 space between words 
\s{2,}     # minimum 2 whitespace 
(\w (?: [ ]? \w+)*) # (2) word char start, word char end, optional 1 space between words 
\s{2,}     # minimum 2 whitespace 
(\w (?: [ ]? \w+)*) # (3) word char start, word char end, optional 1 space between words 
\s*      # optional many witespaces before end 
$      # EOL 
4

Ваше понимание неверное. Скобки не увеличивают приоритет, просто группируются. Проблема в том, что кванторы продвигаются настолько, насколько это возможно, ([\w ]+) соответствует последним двум пробельным символам. Ваш пример не очень ясен, но вы можете использовать не жадные кванторы, добавляя дополнительные ?.

Вот тест:

#!/usr/bin/env perl 

use warnings; 
use strict; 

while (<DATA>) { 
     m/^([\w ]+?)\s{2,}([\w ]+?)\s{2,}([\w ]+?)$/; 
     print "$1 -- $2 -- $3\n"; 
} 

__DATA__ 
some words  blah blah 123 

Это дает:

some words -- blah blah -- 123 
+0

Что касается приоритета, я воспользовался ссылкой http://docstore.mik.ua/orelly/perl3/lperl/ch08_05.htm – t0mmyt

 Смежные вопросы

  • Нет связанных вопросов^_^