2017-06-14 40 views
1

我想匹配任何文本內部的某些行以及匹配的內部,我希望隨時更換某個字符。 示例文本:替換正則表達式匹配中的字符

任何文字和「多」「更多」它。不要更換此報價
CatchThis(這裏不包括引號,「任何更多的文本」,「等等等等......」)
catchthat(「其他一些文字」,「以下」)
一些文字
CatchAnything「之間」(「更加」,「多」,不包括引號那裏,「文本的牆」)
以上(「文字」「」「)和報價之後。 ..

現在我想替換圓括號內的每個引號可以說,一個散列符號。 預期結果:

任何文字和「很多」「更多」它。不要更換此報價
CatchThis(沒有引號這裏,#任何更多的文本#,#,然後等等等等...#)
catchthat(#some其他文本#,#OR少#)
一些文字
CatchAnything 「之間」(#even更#,#,然後更#,暫無報價出現,#wall的文本#)
以上( 「文字」 「」「)和報價之後。 ..

匹配的線是非常容易的我的模式爲:

(?i)Catch(?:This|That|Anything)[ \t]*\(.+\) 

不幸的是,我不知道如何搭配每一個報價和替換它...

回答

1

的常用方法的一些模式所有出現的匹配內2個不同的分隔符是通過使用基於\G anchor正則表達式替換字符。

(?i)(?:\G(?!\A)|Catch(?:This|That|Anything)\s*\()[^()"]*\K" 

查看regex demo

說明

  • (?i) - 不區分大小寫修改
  • (?: - 非捕獲組匹配2層的替代品
    • \G(?!\A) - 以前的成功匹配之後字符串的地方(因爲\G也匹配字符串的開頭,(?!\A)是必要的以排除該可能性)
    • | - 或
    • Catch(?:This|That|Anything) - Catch隨後與任一ThisThatAnything
    • \s* - 0+空格
    • \( - 字面(符號
  • ) - 非的端捕獲組
  • [^()"]* - 任何0+字符超過()"
  • \K其他 - 匹配復位操作
  • " - 一個雙引號。
+1

非常好!正是醫生的命令。完美地工作......併爲解釋做好準備! – TheFriesel

+1

爲了防止你需要在多個*字符分隔符之間匹配多個標記,我可以建議使用[「tempered greedy token」](https://stackoverflow.com/a/37343088/3832970)而不是否定字符(這裏使用了'[^()「] *') –

+0

感謝您的支持!我會查看它,但首先,我必須完全理解您的模式;) – TheFriesel

0

你真的需要更換這裏面的正則表達式?如果您正則表達式找到你想要的東西,你可以找到字符串

+0

這就是我現在正在做的:獲取一組匹配項,替換引號並將修改過的匹配注入原始文本。它的相當精巧,我雖然,直接取代比賽內更優雅,也許更快... – TheFriesel

相關問題