[英]How to match a string with a regex only if it's between two delimiters?
我的目標是使用帶有 Java 7 的正則表達式從輸入中刪除所有匹配項:
input.replaceAll([regex], "");
給定這個帶有目標字符串abc-
的示例input
:
<TAG>test-test-abc-abc-test-abc-test-</TAG>test-abc-test-abc-<TAG>test-abc-test-abc-abc-</TAG>
我可以在上面的代碼中使用什么正則表達式來匹配abc-
僅當它位於<TAG>
和</TAG>
分隔符之間時? 這是所需的匹配行為,使用<-->
進行匹配:
<--><--> <--> <--> <--><-->
<TAG>test-test-abc-abc-test-abc-test-</TAG>test-abc-test-abc-<TAG>test-abc-test-abc-abc-</TAG>
預期結果:
<TAG>test-test-test-test-</TAG>test-abc-test-abc-<TAG>test-test-</TAG>
左右分隔符總是不同的。 我並不是特別在尋找遞歸解決方案(嵌套分隔符)。
我認為這對於前瞻和/或后視可能是可行的,但我沒有得到任何結果。
您可以使用正則表達式
(?s)(\G(?!^)|<TAG>(?=.*?</TAG>))((?:(?!<TAG>|</TAG>).)*?)abc-
請參閱正則表達式演示。 替換為$1$2
。 詳情:
(?s)
- Pattern.DOTALL
嵌入標志選項(\G(??^)|<TAG>(.=?*?</TAG>))
- 第 1 組 ( $1
):兩者之一:
\G(?!^)
- 上一次成功匹配的結束|
- 或者<TAG>(?=.*?</TAG>)
- <TAG>
后面緊跟零個或多個字符,盡可能少,后面跟</TAG>
(因此,我們確保確實存在關閉,在字符串中進一步的右手定界符)((?:(?.<TAG>|</TAG>)?)*?)
- 第 2 組 ( $2
):任何一個字符 ( .
),零次或多次重復,但盡可能少 ( *?
)不啟動<TAG>
或</TAG>
字符序列(又名回火貪婪令牌)abc-
- 要刪除的模式abc-
。在 Java 中:
String pattern = "(?s)(\\G(?!^)|<TAG>(?=.*?</TAG>))((?:(?!<TAG>|</TAG>).)*?)abc-";
String result = text.replaceAll(pattern, "$1$2");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.