我有一个正则表达式
(\\w+[ ]*|-\\w+[ ]*)(!=|<=|>=|=|<|>| not in | in | not like | like )(.*)
这有 3 个以逗号分隔的部分。
当我尝试将其与类似的东西相匹配时
product(getProduct_abc) in (Xyz)
它与正则表达式不匹配。
但是当我尝试匹配时
100=product(getProduct_abc) in (Xyz)
它完美匹配。
正则表达式有什么问题?
我有一个正则表达式
(\\w+[ ]*|-\\w+[ ]*)(!=|<=|>=|=|<|>| not in | in | not like | like )(.*)
这有 3 个以逗号分隔的部分。
当我尝试将其与类似的东西相匹配时
product(getProduct_abc) in (Xyz)
它与正则表达式不匹配。
但是当我尝试匹配时
100=product(getProduct_abc) in (Xyz)
它完美匹配。
正则表达式有什么问题?
正则表达式本身没有任何问题。它只是与指定的字符串不匹配。
您需要为自己找到一个关于正则表达式的良好参考并学习基础知识。一个是http://www.regular-expressions.info/。作为初学者,这可能是也可能不是一个很好的参考。(我正在使用他的 RegexBuddy 工具来测试您的正则表达式。)
这是表达式的粗略细分:
(Xyz) 中的字符串 'product(getProduct_abc)' 无法匹配,因为在 ' in
' 运算符之前不仅有“单词”字符。括号不被视为“单词”字符,因此会导致匹配失败。
第二个字符串 ('100=product(getProduct_abc) in (Xyz)') 匹配,因为它使用等于 ('=') 作为第二个捕获组的匹配运算符,'100' 是所有“单词”字符的字符串,并且'='之后的所有内容都匹配“任何字符”部分,因此匹配成功。请注意,根据字符串结尾的处理方式,如果该字符串位于字符串的最末尾,某些语言甚至可能不匹配该字符串。
如果第一个字符串应该匹配,那么您需要与您的业务用户核实。也许他们也是正则表达式的初学者,并且给了你一个不起作用的。;-)
这就是我所看到的:
'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)'