为什么我的正则表达式也要获取EOLN?

问题描述 投票:1回答:1

我正在尝试编写一个批处理文件来自动执行某些Pascal源代码的批量编辑。我的源文件偶尔有这样的一行:

     //{## identifier} Inc (Index) ; { a comment }    // another comment

而且我想将它们全部更改为:

     {$ifdef identifier} Inc (Index) ; { a comment }    // another comment {$endif}

下面是我正在使用的测试批处理文件。

:: File TestRXRepl.bat
:: ===================     

@echo     //{##   identifier} Inc (Index) ; { a comment }    // another comment >t.pas
@set "FindRegExp=(\ *)\/\/\{\#\#\ *([a-z,0-9,_]+)\}(\ *)(.*)"
@set "ReplRegExp=\1{$ifdef \2}\3\4 {$endif}"

rxrepl --file t.pas --output t.out --search "%FindRegExp%" --replace "%ReplRegExp%"
@type t.pas
@type t.out

正则表达式应该:

  • 捕获前缩进(组1)
  • 匹配//{##
  • 跳过任何空格
  • 捕获标识符(第2组)
  • 匹配}
  • 捕获源代码缩进(第3组)
  • 捕获源代码行,然后到该行的末尾(第4组)

除行尾处理外,所有工作正常。第4组应该捕获从源代码行的开始到行尾的所有内容,但似乎include行尾,结果是{endif}被写入下一行,即我得到:

{$ifdef identifier} Inc (Index) ; { a comment }    // another comment
{$endif}

而不是:

{$ifdef identifier} Inc (Index) ; { a comment }    // another comment {$endif}

我正在使用的工具是RXRepl。它有一个选项--eol,听起来似乎很有用,但我无法通过使用它来改变其行为。

((注))

  • 我知道这两个结果在语法上都是正确的,但这不是点;-)
  • 第3组和第4组可以合并。
  • 它不处理其他空格字符。
  • 我知道,有多种匹配标识符的方法。

欢迎提出使它更优雅的建议,以及使之正常工作的建议。

regex pcre
1个回答
1
投票

问题似乎是您的.与换行符匹配,这意味着PCRE2_DOTALL选项有效。 (我不知道为什么会这样,rxrepl可能始终默认设置该选项。)

一种可能的解决方法是,使用(.*\S)来匹配正则表达式中的第4组与\S character type的匹配,该匹配将匹配所有非空格字符,并排除换行符。

但是解决此问题的最佳方法可能是使用\S,在手册中将其描述为:

当未设置the \N sequence时,\N转义序列与“ \N”元字符具有相同的含义,但设置.不会更改PCRE2_DOTALL的含义。

因此,只需将您比赛中的第4组使用PCRE2_DOTALL,就会匹配当前匹配的所有内容,但结尾的换行符除外。

在您的脚本中,只需更新此行:

\N
© www.soinside.com 2019 - 2024. All rights reserved.