我正在编制的情况下表的法律书。 我已经将它转换为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编辑?
我不熟悉的凯特,但它似乎使用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专业 ; 它有我见过在编辑器中最好的正则表达式的支持。