簡體   English   中英

Java正則表達式-負數后置量詞

[英]Java regex - quantifier in negative lookbehind

這個正則表達式問題是該問題的擴展

輸入項

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

謝謝您的幫助!

這是令人難以置信的緩慢的后lookbehind功能的局限性。 對於后向而言,您不能具有與任意長度的文本匹配的表達式。 錯誤消息告訴我們的是什么。

您可以嘗試這樣的事情:

(<start number>[-+]?\d*\.?\d+<end number>)|([-+]?\d*\.?\d+)
  • $ 1:包含標簽的匹配項。
  • $ 2:不包含標簽的匹配項。

然后相應地替換文本。

可以在其后的外觀中添加\\d而不是添加\\d

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

后退/ lookahead中的豎線字符( | )是布爾值“或”。 此解決方案與您嘗試的解決方案相似,但不會引起異常,因為后向值具有固定長度。

對其進行更詳細的解釋:由於正則表達式應該與十進制數匹配,因此不得包含前導或尾隨數字,因為它們應該是匹配的一部分。 因此,它們也被禁止(使用負向后看/超前)。

現場演示: https : //regex101.com/r/MdS7rF/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM