2014-03-12 82 views
1

我有這些字符串:添加一個 「或」 正則表達式

[?q]this is a test[?p] 

而且

[?q]this is a test<RANDOM_TAG> 

我想[?q][?p]OR[?q]<之間的所有文字 它是隻有一種模式可以做到這一點?

我到目前爲止已經做到了這一點:

[\\?q](.*?)(<)? 

回答

2

您可以使用以下模式:

\[\?q\](.*?)(?:\[\?p\]|<) 

工作實例here on regex101


它是如何工作的:

  • \[\?q\]檢查字面順序[?q]
  • (.*?)是捕獲組得到任何字符序列,直到它到達之一:
    • \[\?p\](字面序列[?p])或
    • <

爲了使圖案的外觀爲[?p]<,我使用的非捕獲組(?:...)含有兩個圖案我可以匹配由|分離,意思是


順便說一句,似乎你的模式,[\\?q](.*?)(<)?,不逃生方括號 ...你需要的話,使用\;)

而且,似乎你也在逃避\:你是否在使用類似的Java字符串來創建你的模式?如果是這樣,實際的Java String你需要使用如下:

"\\[\\?q\\](.*?)(?:\\[\\?p\\]|<)" 

用法示例中的Java:

public class Main { 
    public static void main(final String[] args) { 
     for (final String s : new String[] { "[?q]this is a test[?p]", "[?q]this is a test<RANDOM_TAG>" }) { 
      System.out.println(s.replaceAll("(\\[\\?q\\])(.*?)(\\[\\?p\\]|<)", "$1AAA$3")); 
     } 
    } 
} 

輸出:

[?q]AAA[?p] 
[?q]AAA<RANDOM_TAG> 

希望這有助於!

+0

謝謝。非常友好的添加解釋。 只是一個簡單的問題,我該如何保持'<'?意思是,如果我做了一個替換,使用AAA $ 1,那麼輸出將是:AAARANDOM_TAG>。我想保持<如果可能,所以它會看起來:AAA Cornwell

+1

嗯我不是很確定我明白了......請給我2分鐘,我想嘗試一下:) – ccjmne

+0

當然。謝謝。我使用這個工具來加速測試:http://regexhero.net/tester/ 也許這對你也有幫助,因爲它可以替代「實時」 – Cornwell

2

首先,要匹配正則表達式中的括號,你必須逃避它們,否則它們將被解釋爲一個字符類。此外,你可以通過使用'|'在正則表達式中添加「或」在一組中間。

所以,你的正則表達式應該是這樣的:

\\[\\?q\\](.*?)(<|\\[\\?p\\]) 

編輯:我使用雙斜線逃跑的原因是因爲這是用什麼的問題,所以我想他是使用Java。

2

嘗試:\[\?q\](.*?)(?:\[\?q\]|<)

來源:

[?q]this is a test<RANDOM_TAG> 

和:

[?q]this is a test[?q]RANDOM_TAG> 

它匹配:this is a test

See it in action

+1

在'。*'之後,你定義了一個大的角色類,我想你想要的是parens,而不是'[]' – beerbajay

+0

非常好的一點。現在修復。謝謝。 – emh