Java正则表达式 - 负面看后的量词

时间:2017-12-15 11:37:25

标签: java regex

此正则表达式问题是this question

的扩展

输入

String input="first number <start number>123.45<end number> 
               and second number 678.90."

所需的输出

String output="first number <start number>123.45<end number> 
               and second number <start number>678.90<end number>."

我尝试了什么

我对<number start>有一个否定的回顾,对<number end>有一个否定的预测:

String regex="(?<!(<number start>))\\d+(\\.\\d+)?(?!(<number end>))
//             ^^^^^^^^^^^^^^^^^^^^              ^^^^^^^^^^^^^^^^^
//            negative lookback                    negative lookahead
//                                 ^^^^^^^^^^^^^
//                                  float match

但问题是,对于字符串<number start>12.34<number end>,它将匹配2.3

当我在回顾中包含量词时,我得到一个错误

String regex="(?<!(<number start>\\d+))\\d+(\\.\\d+)?(?!(\\d+<number end>))
//             ^^^^^^^^^^^^^^^^^^^^^^^               ^^^^^^^^^^^^^^^^^
//            negative lookback                      negative lookahead
//                                     ^^^^^^^^^^^^^
//                                     float match

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这是一个极其缓慢的WebBrowser功能的限制。对于lookbehind,您不能拥有与任意长度的文本匹配的表达式。这是错误消息告诉我们的内容。

您可以尝试这样的事情:

HTML DOM
  • $ 1:匹配包括标签。
  • $ 2:不包含标签的匹配。

然后相应地替换文本。

答案 1 :(得分:0)

您可以在其后的外观中添加一个\d,而不用添加一个{}:

(?<!<number start>|\d)\d+(?:\.\d+)?(?!\d|<number end>)

后向/前行中的竖线字符(|)是布尔“或”。此解决方案与您尝试的解决方案相似,但是不会引起异常,因为后向值具有固定长度。

为了更详细地解释它,由于正则表达式应该与十进制数匹配,因此不能有前导或尾随数字,因为它们应该是匹配的一部分。因此,也禁止使用它们(禁止使用负向查找/向前查找)。

实时演示:https://regex101.com/r/MdS7rF/1