看看凯特身上的图案



我正在为一本法律书编写一个案例表。我已经将其转换为HTML,这样我就可以使用标签进行搜索和替换操作,我目前正在Kate工作。正文是指案例的名称,案例的引文在脚注中,例如

<i>Smith v Jones</i>127 ......... [other stuff including newline characters].......</br>127 (1937) 173 ER 406;

我已经能够在凯特进行前瞻性工作,使用:

<i>.*</i>([0-9]{1,4}) .+<br/>1 .*<br/>

但我遇到了贪婪的问题。

文本一团糟,所以我真的需要一步一步地找到匹配项,而不是依赖于批处理过程。

有没有一个Linux(或Windows)文本编辑器同时支持前瞻性和非贪婪运算符,或者我必须尝试grep或sed?

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

但无论如何,最好不要一直依赖于非贪婪的量词。首先,正如许多人所说,他们不能保证最短的比赛时间。你应该养成一个习惯,在不太困难的时候,更具体地说明什么应该匹配,什么不应该匹配。例如,如果要匹配的部分不包含除示例字符串中的标签之外的任何标签,则可以执行以下操作:

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

使用[^<]*而不是.*的优点是,在下一个<之后,它永远不会尝试匹配任何内容。.*一开始总是抓取文档的其余部分,结果几乎一直回溯到起点。非贪婪版本.*?最初只与下一个<匹配,但如果稍后匹配尝试失败,它将继续使用<及更高版本,最终使用整个文档。

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

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

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

如果你可以选择切换到不同的编辑器,我强烈建议你这样做。我最喜欢的是EditPad Pro;它拥有我在编辑器中见过的最好的regex支持。

相关内容

  • 没有找到相关文章

最新更新