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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 - Fatal编程技术网

Regex 如何让这个perl扩展正则表达式工作?

Regex 如何让这个perl扩展正则表达式工作?,regex,perl,Regex,Perl,我有以下代码 输出 我希望这两个正则表达式是等效的,并且只捕获数组的第一行。然而,只有$nregex起作用 如何修复$regex,使其与x选项的工作方式相同 编辑 根据响应,更新了正则表达式,它可以正常工作 my $regex = qr/^ \s* Line \s* # Bare word (\d+)\. \s* # line number \[ \s* # Open brace

我有以下代码

输出 我希望这两个正则表达式是等效的,并且只捕获数组的第一行。然而,只有$nregex起作用

如何修复$regex,使其与x选项的工作方式相同

编辑 根据响应,更新了正则表达式,它可以正常工作

my $regex = qr/^       \s*
               Line    \s* # Bare word
               (\d+)\. \s* # line number
               \[      \s* # Open brace
               (\w+)   \s* # Text in braces
               ]       \s* # close brace
               .*          # slurp
               $
              /x;

你的两个表情不一样。您需要在第一个中包含\s*位。/x允许您编写格式整洁的表达式,其中包含您注意到的注释。因此,/x版本中的空格并不重要,也不会对任何匹配活动产生影响

换句话说,您的/x版本相当于

qr/^Line(\d+)\.\[(\w+)].*$/x
顺便说一句,仅使用普通空间而不是\s*或\s+也会失败很多次;您的示例数据包含两个相邻的空格。这两个位置将不匹配单个空间


最后一个提示:当您必须在某个位置至少有一个空格时,您应该使用\s+强制至少有一个空格。一旦你知道这是可能的,你肯定可以找出在你的模式中哪些地方可能有用。

你的两个表达式是不同的。您需要在第一个中包含\s*位。/x允许您编写格式整洁的表达式,其中包含您注意到的注释。因此,/x版本中的空格并不重要,也不会对任何匹配活动产生影响

换句话说,您的/x版本相当于

qr/^Line(\d+)\.\[(\w+)].*$/x
顺便说一句,仅使用普通空间而不是\s*或\s+也会失败很多次;您的示例数据包含两个相邻的空格。这两个位置将不匹配单个空间


最后一个提示:当您必须在某个位置至少有一个空格时,您应该使用\s+强制至少有一个空格。一旦你知道这是可能的,你肯定可以找出在你的模式中哪些地方可能有用。

试着写同样的模式。使用/x,你的空白是无关紧要的。如果要匹配空格,需要使用[]*或\s*或类似的字符,就像在其他正则表达式中一样。如果您只想这样做,则。*$后缀是多余的。当然,如果您在循环中进行匹配,并且需要下一次尝试从行的开头开始,这可能会很有用,但使用“^”锚定已经解决了这一问题。请尝试编写相同的模式。使用/x,您的空白是无关紧要的。如果要匹配空格,需要使用[]*或\s*或类似的字符,就像在其他正则表达式中一样。如果您只想这样做,则。*$后缀是多余的。当然,如果您在循环中进行匹配,并且需要下一次尝试从行的开头开始,这可能会很有用,但使用^。
qr/^Line(\d+)\.\[(\w+)].*$/x