我在文件中搜索不以反斜杠(\
)结尾的行,但它们必须以某些文字开头,所以我写了:
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 ) {
它完美无缺。但我很好奇我的负面前瞻是什么问题。
答案 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}}你应该怎样处理那些以反斜杠后跟空格结束的行。