我有这些字符串:
[?q]this is a test[?p]
和
[?q]this is a test<RANDOM_TAG>
我希望获得[?q]
和[?p]
或 [?q]
和<
之间的所有文字
是否有可能只用一种模式呢?
到目前为止我已经做到了这一点:
[\\?q](.*?)(<)?
答案 0 :(得分:2)
您可以使用以下模式:
\[\?q\](.*?)(?:\[\?p\]|<)
工作示例here on regex101。
工作原理:
\[\?q\]
检查文字序列[?q]
(.*?)
是获取任何char序列的捕获组,直到它到达:
\[\?p\]
(文字序列[?p]
)或<
要使模式符合 [?p]
或 <
,我使用非捕获组 ,(?:...)
包含我可以匹配的两种模式,以|
分隔,表示或。
顺便说一下,您的模式[\\?q](.*?)(<)?
似乎没有逃避 方括号 ......您需要这样做,使用\
;)
此外,您似乎也在逃离\
:您是否正在使用类似 Java String 的内容来创建模式?如果是这样,您需要使用的实际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>
希望这有帮助!
答案 1 :(得分:2)
首先,要匹配正则表达式中的括号,您必须转义它们,否则它们将被解释为字符类。此外,您可以添加&#34;或&#34;在正则表达式中使用&#39; |&#39;在一个小组的中间。
所以你的正则表达式看起来像这样:
\\[\\?q\\](.*?)(<|\\[\\?p\\])
编辑:我使用双斜线转义的原因是因为问题使用的是什么,所以我假设他使用的是Java。
答案 2 :(得分:2)
尝试:\[\?q\](.*?)(?:\[\?q\]|<)
自:
[?q]this is a test<RANDOM_TAG>
和
[?q]this is a test[?q]RANDOM_TAG>
匹配:this is a test