搜索不以给定字符结尾的行

时间:2015-03-23 22:51:50

标签: regex perl

我在文件中搜索不以反斜杠(\)结尾的行,但它们必须以某些文字开头,所以我写了:

if ( $cur_line =~ m{\A\s+(.+?)(?!\\)\z/xms ){
 ... # parentheses are only for testing
}

但是上面的$1总是包含整行(没有前导空格),包括末尾的反斜杠。只有第一次出现的末尾没有反斜杠才能正确匹配。在此之后,所有带尾部反斜杠的行都匹配。为什么?我做错了什么?

当我使用时:

if ( $cur_line =~ m{\A\s+[^\\]+(?!\\)\z/xms ){
 ...
}

它的工作原理几乎正确$cur_line然后可以包含反斜杠。

我检查了以下代码:

if ( $cur_line !~ m{\\\z}xms ) {

它完美无缺。但我很好奇我的负面前瞻是什么问题。

2 个答案:

答案 0 :(得分:1)

如果您的引擎支持负面后视

,您可以使用此模式
\A\s+(.*)(?<!\\)\z

或此模式(如果不是

\A\s+(.*[^\\])\z

你的第一个模式无法工作的原因是因为(.+?)已经消耗了最后一个反斜杠而最后一个反斜杠没有看到\之前的<{p}}

答案 1 :(得分:0)

准确写出你所描述的内容似乎最直截了当。您要求“不以反斜杠结尾的行,但它们必须从某些文本开始”

这会查找字符串\z的结尾,而不是反斜杠(?<!\\)(反斜杠必须重复)。第二个正则表达式检查字符串中的某个地方是否存在非空格字符。

for ( 'abcdef\\', 'abcdef',  '\\', '' ) {
  printf "'%s' -- %s\n", $_, /(?<!\\)\z/ && /\S/ ? 'match' : 'no match';
}

<强>输出

'abcdef\' -- no match
'abcdef' -- match
'\' -- no match
'' -- no match

请注意,检查行末尾的内容可能会因为后续换行而受到质疑,因此在测试之前应该chomp每一行。{1}}你应该怎样处理那些以反斜杠后跟空格结束的行。