0

我有一个正则表达式

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

这有 3 个以逗号分隔的部分。

当我尝试将其与类似的东西相匹配时

product(getProduct_abc) in (Xyz)

它与正则表达式不匹配。

但是当我尝试匹配时

100=product(getProduct_abc) in (Xyz)

它完美匹配。

正则表达式有什么问题?

4

2 回答 2

0

正则表达式本身没有任何问题。它只是与指定的字符串不匹配。

您需要为自己找到一个关于正则表达式的良好参考并学习基础知识。一个是http://www.regular-expressions.info/。作为初学者,这可能是也可能不是一个很好的参考。(我正在使用他的 RegexBuddy 工具来测试您的正则表达式。)

这是表达式的粗略细分:

  • 共有三个捕获组,每个组都用自己的一对括号括起来。(请注意,括号以及许多其他字符在正则表达式中具有特殊含义,因此要匹配任一方向的括号,您需要对其进行转义。给定的正则表达式不会这样做。)
  • 在第一个捕获组中,匹配有两种可能的选择。他们是:
    • 一个或多个“单词”字符后跟零个或多个空格,或
    • 一个破折号,后跟一个或多个“单词”字符,后跟零个或多个空格
  • 在第二个捕获组中,有 10 个可能的匹配项:列出的运算符符号(不带空格)或列出的文本运算符(带空格)
  • 在第三个捕获组中,零个或多个任何字符都将匹配。

(Xyz) 中的字符串 'product(getProduct_abc)' 无法匹配,因为在 ' in' 运算符之前不仅有“单词”字符。括号不被视为“单词”字符,因此会导致匹配失败。

第二个字符串 ('100=product(getProduct_abc) in (Xyz)') 匹配,因为它使用等于 ('=') 作为第二个捕获组的匹配运算符,'100' 是所有“单词”字符的字符串,并且'='之后的所有内容都匹配“任何字符”部分,因此匹配成功。请注意,根据字符串结尾的处理方式,如果该字符串位于字符串的最末尾,某些语言甚至可能不匹配该字符串。

如果第一个字符串应该匹配,那么您需要与您的业务用户核实。也许他们也是正则表达式的初学者,并且给了你一个不起作用的。;-)

于 2011-01-14T05:40:53.500 回答
0

这就是我所看到的:

'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)'
于 2011-01-14T06:12:52.627 回答