[英]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+)
然后相應地替換文本。
可以在其后的外觀中添加\\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.