我有這些字符串:添加一個 「或」 正則表達式
[?q]this is a test[?p]
而且
[?q]this is a test<RANDOM_TAG>
我想[?q]
和[?p]
OR[?q]
和<
之間的所有文字 它是隻有一種模式可以做到這一點?
我到目前爲止已經做到了這一點:
[\\?q](.*?)(<)?
我有這些字符串:添加一個 「或」 正則表達式
[?q]this is a test[?p]
而且
[?q]this is a test<RANDOM_TAG>
我想[?q]
和[?p]
OR[?q]
和<
之間的所有文字 它是隻有一種模式可以做到這一點?
我到目前爲止已經做到了這一點:
[\\?q](.*?)(<)?
您可以使用以下模式:
\[\?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>
希望這有助於!
首先,要匹配正則表達式中的括號,你必須逃避它們,否則它們將被解釋爲一個字符類。此外,你可以通過使用'|'在正則表達式中添加「或」在一組中間。
所以,你的正則表達式應該是這樣的:
\\[\\?q\\](.*?)(<|\\[\\?p\\])
編輯:我使用雙斜線逃跑的原因是因爲這是用什麼的問題,所以我想他是使用Java。
嘗試:\[\?q\](.*?)(?:\[\?q\]|<)
來源:
[?q]this is a test<RANDOM_TAG>
和:
[?q]this is a test[?q]RANDOM_TAG>
它匹配:this is a test
謝謝。非常友好的添加解釋。 只是一個簡單的問題,我該如何保持'<'?意思是,如果我做了一個替換,使用AAA $ 1,那麼輸出將是:AAARANDOM_TAG>。我想保持<如果可能,所以它會看起來:AAA –
Cornwell
嗯我不是很確定我明白了......請給我2分鐘,我想嘗試一下:) – ccjmne
當然。謝謝。我使用這個工具來加速測試:http://regexhero.net/tester/ 也許這對你也有幫助,因爲它可以替代「實時」 – Cornwell