前瞻凯特的模式(lookahead in kate for patterns)

2019-07-31 10:54发布

我正在编制的情况下表的法律书。 我已经将它转换为HTML,所以我可以使用标签搜索和替换操作,和我目前的工作凯特。 该文本是指案件的名称和案件的引文在脚注中,如

<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编辑?

Answer 1:

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

但最好不要依赖非贪婪量词所有的时间呢。 一方面,他们不能保证在最短的比赛,因为许多人说。 你应该在更加具体什么应该和不应该被匹配,当不是太困难的习惯。 例如,如果部分要匹配不包含除在样本串之外的其他任何标签,你可以这样做:

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

使用的优点[^<]*代替.*是,它永远不会尝试匹配后的下一个什么<.*总是抢文档的其余部分在第一,只有原路返回,几乎一路的起点。 非贪婪版本, .*? ,最初将只匹配到下一个< ,但如果匹配尝试失败后它会继续和消耗<超越,最终消费对整个文档。

如果可以有其他标签,则可以使用[^<]*(<(?!br/>)[^<]*)*代替。 这将消耗不属于任何字符<<如果它不是一个的开始<br/>标签。

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

顺便说一句,你叫什么前瞻(我假设你的意思是\1 )确实是一个反向引用 。 在(?!br/>)在我的正则表达式是向前看符号的一个例子-在这种情况下, 先行。 凯特/ QRegExp文档声称向前看符号是支持的,但非捕获groups--如(?:...) --aren't,这就是为什么使用的所有捕获组在这最后的正则表达式。

如果你可以切换到不同的编辑器的选项,我强烈建议你这样做。 我最喜欢的是的EditPad专业 ; 它有我见过在编辑器中最好的正则表达式的支持。



文章来源: lookahead in kate for patterns