如果我在Notepad++中使用长正则表达式,即:
^([^ ]+) ([^ ]+) ([^ ]+) (\[.*?\]) (".*?") (".*?") (".*?") (".*?") (\d+) (\d+) (\d+)$
(这是为了将 Apache 日志行从空格分隔变为制表符分隔)
然后我无法成功使用超过九个反向引用进行替换,因为
\10
产生第一个捕获组的内容加上文字“0”。
我尝试使用
$10
,但这给出了相同的结果。
您可以为此使用花括号:
${10}
作为参考,Notepad++ 使用
boost::regex
,您可以在此处找到其替换模式文档:Boost-扩展格式字符串语法。这种替换模式允许在替换模式中使用更复杂的表达式(例如条件和常见的 Perl 占位符)。
只需使用花括号:
${10}
这将确保引用第 10 个捕获组,而不是后跟零的第 1 个组。
在 2024 年(也许更早),高阶反向引用的
${10}
语法不再有效。
我们在搜索对话框的状态栏中收到此错误消息:
查找:无效的正则表达式
但是,根据搜索| Notepad++ 使用手册搜索 | Notepad++ 用户手册,第 捕获组和反向引用,存在以下选项:
\ℕ
、\gℕ
、\g{ℕ}
、\g<ℕ>
、\g'ℕ'
、\kℕ
、\k{ℕ}
、\k<ℕ>
或 \k'ℕ'
这里的
ℕ
有点误导,因为它是数字或标识符的占位符。多位数字必须用 <>
、{}
或 ''
引用。名称必须始终加引号。所有需要引用的内容都必须以 g
或 k
为前缀。
因此像 1234567890xx0987654321
或
abcdefghijkkjihgfedcba
这样的 22 个字符的 回文可以通过以下所有模式进行匹配:
^(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)\g{11}\g<10>\9\8\7\6\5\4\3\2\1$
^(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)\k{11}\k<10>\9\8\7\6\5\4\3\2\1$
^(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)\k<11>\k<10>\9\8\7\6\5\4\3\2\1$
^(\w)(\w)(\w)(\w)(\w)(\w)(\w)(?<Y>\w)(\w)(\w)(?<namex>\w)\k{namex}\k<10>\9\k<Y>\7\6\5\4\3\2\1$