1

我正在为一本法律书籍编制一个案例表。我已将其转换为 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?

4

1 回答 1

1

我不熟悉 Kate,但它似乎使用QRegExp,它在许多重要方面与其他类似 Perl 的正则表达式风格不兼容。例如,大多数风格允许您通过附加问号(例如.*=> .+?)使单个量词非贪婪,但在 QRegExp 中,您只能使它们全部贪婪或全部非贪婪。更糟糕的是,看起来凯特甚至不允许你这样做——Non-Greedy例如,通过一个复选框。

但无论如何,最好不要一直依赖非贪婪的量词。一方面,正如许多人所说,他们不能保证最短的匹配。你应该养成更具体的习惯,什么应该和不应该匹配,当这不是太难的时候。例如,如果您要匹配的部分不包含除示例字符串中的标签之外的任何标签,您可以这样做:

<i>[^<]*</i>(\d+)\b[^<]+<br/>\1\b[^<]*<br/>

使用[^<]*instead of的好处.*是它永远不会尝试匹配 next 之后的任何内容<.*总是会首先抓取文档的其余部分,只是几乎一直回溯到起点。非贪婪版本 ,.*?最初将只匹配下一个<,但如果稍后匹配尝试失败,它将继续并消耗<和超越,最终消耗整个文档。

如果可以有其他标签,则可以使用[^<]*(<(?!br/>)[^<]*)*。它将使用任何不是 的字符<,或者<如果它不是<br/>标签的开头。

<i>[^<]*</i>(\d+)\b[^<]*(<(?!br/>)[^<]*)*<br/>\1\b[^<]*(<(?!br/>)[^<]*)*<br/>

顺便说一句,您所说的前瞻(我假设您的意思是\1)实际上是反向引用。我的(?!br/>)正则表达式中的 是前瞻的一个例子——在这种情况下是前瞻。Kate/QRegExp 文档声称支持前瞻但非捕获组——例如——不支持(?:...),这就是为什么在最后一个正则表达式中使用所有捕获组的原因。

如果您可以选择切换到其他编辑器,我强烈建议您这样做。我最喜欢的是EditPad Pro;它具有我在编辑器中见过的最好的正则表达式支持。

于 2012-09-09T02:09:55.337 回答