在凯特中寻找模式

时间:2012-09-08 00:32:18

标签: regex greedy lookahead non-greedy kate

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

1 个答案:

答案 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;它拥有我在编辑器中见过的最好的正则表达式支持。

相关问题