соответствие регулярному выражению "не предшествует, если не сопровождается" - PullRequest
2 голосов
/ 16 января 2012

Пример входной строки:

(F1 (F2 X (Y) Z) (F3 A B)

То, что я хочу сопоставить: \w+, которому не предшествует (, если за ним не следует )
В этом случае: X, Y, Z, A и B

Временное временное решение (которое, как я знаю, позже вызовет у меня проблемы) - /\(\w+\)| \w+/, но, так как оно также соответствует пробелам, оно будет вызывать проблемы в дальнейшем, особенно когда дело доходит до замены спички.

Я провел некоторые эксперименты в области негативного взгляда сзади в виде:

/(?!=\()\w+/

... но я не могу найти способ объединить его с ", которому не предшествует ("

Просто чтобы прояснить:

  • В этом случае все совпадения состоят из одной буквы, но фактические данные могут состоять из нескольких символов и даже не могут быть буквенно-цифровыми.
  • Никакие пробелы или круглые скобки не могут быть частью возвращенного совпадения.

Ответы [ 5 ]

2 голосов
/ 16 января 2012

Попробуйте:

(?<=[ (])\w(?=[ )])

См. Здесь в действии: http://regexr.com? 2vnri


На самом деле, это может быть то, что вы ищетедля:

(?<= )\w+(?=[ )])|(?<=\()\w+(?=\))

См. здесь в действии: http://regexr.com? 2vnro

1 голос
/ 16 января 2012

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

my $str = "(F1 (F2 X (Y) Z) (F3 A B)";
$str =~ s/\(\w+(?![)\w])//g;

т.е. любые открывающие скобки, за которыми следуют буквенно-цифровые символы, за которыми не следует закрывающая скобка или несколько буквенно-цифровых символов.

Тогда просто извлечь буквенно-цифровые цифры:

my @items = $str =~ /\w+/g;
say for @items;
1 голос
/ 16 января 2012
/(?<! [(\w] (?! \w+ \) ) ) \w+/x

или

/(?<! [(\w] ) \w+ | (?<= \( ) \w+ (?= \) )/x
0 голосов
/ 16 января 2012

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

perl -e '$string="(F1 (F2 X (Y) Z) (F3 A B)";
@params=$string=~/((?<=\()\w+(?=\))|(?<![(\w])\w+)(?!\w)/g;
print join(",",@params),"\n";'

X,Y,Z,A,B
0 голосов
/ 16 января 2012

Существует отличная запись для сопоставления круглых скобок с регулярным выражением perl по адресу: Сопоставление математического выражения с регулярным выражением? Однако, это не рекомендуется для любого поддерживаемого кода. Обычный код для этого; Однако это легко: (psudeocode ниже)

match=true; 
while(match && ch=getchar())
    if(ch==')')
        pop() or match=false
    else if(ch=='(')
        push(ch);
    else if(!isalphanum(ch) &&  ch=!' ')
        match=false;
if(match)
   match=pop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...