我有 2 个正则表达式,它们捕获我需要的两个实例。但是我需要将它们组合起来,所以我只有 1 个正则表达式。这些对我来说很复杂,我不确定如何组合它们,或者它们如何匹配我正在寻找的东西。所以我希望有人不仅可以告诉我如何做,而且可以将其分解,这样我就可以知道发生了什么。这将不胜感激。第一个能够捕获以逗号分隔的字段。它适用于逗号在括号之间但不在单引号之间时被绕过的每个实例。第二个是单引号之间的工作,但当字段不以括号开头时不在括号内,
/((?:[^(),]+ | ( \((?: [^()]+ | (?2) )*\) ))*)(?: ,\s* | $)/xg
/(?:^|\s*,)\s*( '[^']*' | \([^)]*\) | [^,]*?(?=\s*(,|$)) )/xg
我就此写了一个类似的问题,但我想重写这个问题以使其更加清晰。这是我正在处理的字符串和第一个正则表达式输出,然后是第二个。加上我想得到的东西。谢谢。
String - "10507, 'KEY,CUST', NAME(FIRST,LAST), (FIRST,LAST)"
Example 1: field 0 is 10507
Example 1: field 1 is 'KEY
Example 1: field 2 is CUST'
Example 1: field 3 is NAME(FIRST,LAST)
Example 1: field 4 is (FIRST,LAST)
Example 2: field 0 is 10507
Example 2: field 1 is 'KEY,CUST'
Example 2: field 2 is NAME(FIRST
Example 2: field 3 is LAST)
Example 2: field 4 is (FIRST,LAST)
Expected field 0 is 10507
field 1 is 'KEY,CUST'
field 2 is NAME(FIRST,LAST)
field 3 is (FIRST,LAST)
所以我希望有人不仅能告诉我如何做,还能告诉我如何分解它,这样我就能知道发生了什么。
您正在使用
/x
正则表达式标志,这使得文字(未转义的)空白变得无关紧要。您可以展开图案并添加注释,如下所示:
/
( # start $1
(?:
# start a field (can't be any of these)
[^(),]+
|
# start $2, matching literal paren groups
(
\(
(?:
[^()]+
|
(?2)
)*
\)
)
)*
)
# handle the next field or the send of the string
(?:
,\s*
|
$
)
/xg
当我第一次在上一个问题中查看这个正则表达式时,我已经发现了问题,例如不处理字符的转义版本。
除此之外,还有一些有用的工具可以观察正则表达式的工作情况。 Regexp::Debugger 让您可以单步执行匹配。这实际上是很神奇的;在终端中运行:
use Regexp::Debugger;
my $pattern = qr/((?:[^(),]+ | ( \((?: [^()]+ | (?2) )*\) ))*)(?: ,\s* | $)/x;
my $string = "10507, 'KEY,CUST', NAME(FIRST,LAST), (FIRST,LAST)";
$string =~ m/$pattern/g;
人们在使用正则表达式时常犯两个常见错误:
我认为在这些模式上花费太多时间没有太大价值,因为它们在其他方面被破坏了。这就是为什么我在我对你之前问题的回答中将其分解为几个更简单的模式。