Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl可选组位于任意位置_Regex_Perl_Optional - Fatal编程技术网

Regex Perl可选组位于任意位置

Regex Perl可选组位于任意位置,regex,perl,optional,Regex,Perl,Optional,我需要捕获多个组,其中一些是可选的。我在中读过关于可选的内容,但是?对我不起作用。示例文件: Code>1<Code foo Prod>2<Prod foo Type>3<Type code>123(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*))您正在查找的(?:…)-捕获组中的?:前缀使其成为一个简单的组,而不是捕获。我建议每次有未捕获的组时都使用此选项,以使您的意图更清晰。它说,“我正在对它进行分组,但没有保留它

我需要捕获多个组,其中一些是可选的。我在中读过关于可选的内容,但是
对我不起作用。示例文件:

Code>1<Code
foo
Prod>2<Prod
foo
Type>3<Type
code>123(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*)(.*))您正在查找的
(?:…)
-捕获组中的
?:
前缀使其成为一个简单的组,而不是捕获。我建议每次有未捕获的组时都使用此选项,以使您的意图更清晰。它说,“我正在对它进行分组,但没有保留它。”它甚至可以使运行时更快,但这不是主要的好处

例如:

perl -0777nE 'say qq[$1;$2;$3] if /Code\>(.*?)\<Code.*?(?:Prod\>(.*?)\<Prod.*?)?Type\>(.*?)\<Type/s' < t

perl-0777nE'说qq[$1;$2;$3]if/code\>(.*?)(.*?)(.*?)\n谢谢你的建议,有用的技巧,我在最后编辑了这个问题。然而,可选性仍然没有得到解决。无论是从
|
中选择第二部分还是从未保留的嵌套组中选择一个未保留。有趣的是,将
*?
移动到可选组中使其工作,我还没有理解为什么。我可以混合命名和编号吗?如果是,是否命名为后续编号的变更编号?我已经编号了,并且想添加一个可选的-我想唯一可能的方法是使用命名的一个。使用名称不会改变编号。也就是说,即使使用命名捕获,它们仍然可以使用相同的编号,就好像没有使用名称一样。因此,如果在一些编号的捕获之前添加一个命名的捕获,那么最终的结果将是编号发生变化。这就是为什么我首先建议使用命名来表示多于一个或两个捕获。如果在匹配中我有特定的第1部分,那么任意可选的第2部分,然后固定可选的第3部分,然后再次使用特定的第4部分,我用*写2个可选组2st?lazy和3nd fixed可选,如果存在(即第一个文本之后的内容,然后是固定的第三个文本),则都将被相应地捕获,或者2st捕获将包括3nd fixed-是否已确定,或者可能取决于实现?Thanx如果您只捕获了3个组,为什么要打印出
$4
?为什么可选的非捕获组中的
.*
?@Tanktalus,$4是由于快速编辑而留下的<代码>.*
-实际上组中没有
后面的
所以我认为它不是可选的,为什么要编写它?