簡體   English   中英

僅當字符串位於兩個分隔符之間時,如何將字符串與正則表達式匹配?

[英]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.

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