Regex заключено в () выпуск - PullRequest
       25

Regex заключено в () выпуск

0 голосов
/ 14 января 2011

У меня есть регулярное выражение

(\\w+[ ]*|-\\w+[ ]*)(!=|<=|>=|=|<|>| not in | in | not like | like )(.*)

Здесь есть 3 раздела, разделенные запятыми.

Когда я пытаюсь сопоставить это с чем-то вроде

product(getProduct_abc) in (Xyz)

Это не соответствует регулярному выражению.

Но когда я пытаюсь соответствовать

100=product(getProduct_abc) in (Xyz)

идеально соответствует.

Что не так с регулярным выражением?

Ответы [ 2 ]

0 голосов
/ 14 января 2011

Вот что я вижу:

'100=product(getProduct_abc) in (Xyz)'  
Group1 match = '100'  
Group2 match = '='  
Group3 match = 'product(getProduct_abc) in (Xyz)'  

'product(getProduct_abc) in (Xyz)'  
        ^  
    Fails here on Group1 match because parenthesis are not included in this group  

Вы можете исправить ситуацию, вызвав последнее вхождение группы 1,2,3 в строку.
Исправление / перезапись эквивалентного совпадения Group1 и разделение групп, они могут быть объединены для получения последнего возможного совпадения.

rxP1 = '(?:-?[\w()]+\ *)';
rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like )';
rxP3 = '(?:.*?)';

rxAll = /(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/;

В Perl:

use strict;
use warnings;

my @samples = (
 'product(getProduct_abc) in (Xyz1)',
 '100=product(getProduct_abc) in (Xyz2)',
 '100 like = != not like >product(getProduct_abc) in (Xyz3)',
);

my $rxP1 = '(?:-?[\w()]+\ *)';
my $rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like )';
my $rxP3 = '(?:.*?)';

for (@samples)
{
    if ( /(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/ ) {
        print "\n1 = '$1'\n";
        print "2 = '$2'\n";
        print "3 = '$3'\n";
    }
}

Выход:

1 = 'product(getProduct_abc)'
2 = ' in '
3 = '(Xyz1)'

1 = 'product(getProduct_abc)'
2 = ' in '
3 = '(Xyz2)'

1 = 'product(getProduct_abc)'
2 = ' in '
3 = '(Xyz3)'
0 голосов
/ 14 января 2011

Нет ничего плохого, по сути, с регулярным выражением. Он просто не соответствует указанной строке.

Вам нужно найти себе хороший справочник по регулярным выражениям и изучить основы. Одним из них является http://www.regular -expressions.info / . Это может быть, а может и не быть хорошей ссылкой на вас как на новичка. (Я использую его инструмент RegexBuddy для проверки вашего регулярного выражения.)

Вот грубая разбивка выражения:

  • Есть три группы захвата, каждая из которых окружена собственной парой скобок. (Обратите внимание, что круглые скобки, наряду со многими другими символами, имеют особое значение в регулярных выражениях, поэтому для сопоставления скобок в любом направлении вам нужно избегать его. Данное регулярное выражение не делает этого.)
  • В первой группе захвата есть два возможных варианта матча. Они есть:
    • Один или несколько символов «слово», за которыми следуют ноль или более пробелов, или
    • Тире, за которым следуют один или несколько символов "слова", за которыми следуют ноль или более пробелов
  • Во второй группе захвата существует 10 возможных совпадений: перечисленные символы операторов (без окружающих пробелов) или перечисленные текстовые операторы (с окружающими пробелами)
  • В третьей группе захвата будет совпадать ноль или более любого символа.

Строка 'product (getProduct_abc) в (Xyz)' не совпадает, потому что до оператора in было больше, чем просто слова. Круглые скобки не считаются символами «слова» и поэтому приводят к сбою.

Вторая строка ('100 = product (getProduct_abc) в (Xyz)') совпадает, потому что она использует равенства ('=') в качестве сопоставленного оператора для второй группы захвата, '100' - это строка всех слова «символы» и все, что после «=», соответствует части «любой символ», поэтому сопоставление завершается успешно. Обратите внимание, что в зависимости от того, как обрабатывается конец строки, некоторые языки могут не совпадать даже с этой строкой, если она находится в самом конце строки.

Если первая строка предполагается, что совпадает, то вам необходимо проверить с бизнес-пользователями. Может быть, они тоже новички с регулярными выражениями, и дали вам тот, который не работает. ; -)

...