我正在编写法律书籍的案例表。我已将其转换为HTML,因此我可以使用标签进行搜索和替换操作,而我目前正在Kate工作。案文涉及案件的名称,案件的引用在脚注中,例如
<i>Smith v Jones</i>127 ......... [other stuff including newline characters].......</br>127 (1937) 173 ER 406;
我已经能够在Kate中使用以下方式进行前瞻:
<i>.*</i>([0-9]{1,4}) .+<br/>\1 .*<br/>
......但我遇到了贪婪问题。
文字很乱,所以我真的需要一步一步找到匹配,而不是依赖批处理。
是否有Linux(或Windows)文本编辑器支持前瞻和非贪婪的运算符,或者我将不得不尝试grep或sed?
答案 0 :(得分:1)
我对Kate不熟悉,但它似乎使用QRegExp,这在许多重要方面与其他类似Perl的正则表达式风格不兼容。例如,大多数口味允许您通过附加问号(例如.*
=&gt; .+?
)使单个量词非贪婪,但在QRegExp中,您只能使它们全部贪婪或全部非贪婪。更糟糕的是,看起来Kate甚至没有让你这样做 - 例如通过Non-Greedy
复选框。
但最好不要一直依赖非贪婪的量词。一方面,正如许多人所说,他们不能保证尽可能短的匹配。你应该养成更加明确应该和不应该匹配的习惯的习惯,这不是太困难。例如,如果要匹配的部分不包含示例字符串中的任何标记,则可以执行以下操作:
<i>[^<]*</i>(\d+)\b[^<]+<br/>\1\b[^<]*<br/>
使用[^<]*
代替.*
的优势在于它永远不会在下一个<
之后尝试匹配任何内容。 .*
首先会抓住文档的其余部分,但几乎一直回溯到起点。非贪婪版本.*?
最初只会与下一个<
匹配,但如果匹配尝试稍后失败,它将继续使用<
及更高版本,最终到消耗整个文件。
如果可以是其他标签,则可以使用[^<]*(<(?!br/>)[^<]*)*
代替。如果它不是<
标记的开头,它将使用非<
或<br/>
的任何字符。
<i>[^<]*</i>(\d+)\b[^<]*(<(?!br/>)[^<]*)*<br/>\1\b[^<]*(<(?!br/>)[^<]*)*<br/>
顺便说一下,你所谓的前瞻(我假设你的意思是\1
)实际上是一个反向引用。我的正则表达式中的(?!br/>)
是前瞻的示例 - 在这种情况下是否定前瞻。 Kate / QRegExp文档声称支持前瞻但非捕获组 - 例如(?:...)
- 不是,这就是为什么在最后一个正则表达式中使用了所有捕获组的原因。
如果您可以选择切换到其他编辑器,我强烈建议您这样做。我最喜欢的是EditPad Pro;它拥有我在编辑器中见过的最好的正则表达式支持。