在正则表达式中添加“或”

时间:2014-03-12 22:22:27

标签: regex

我有这些字符串:

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

[?q]this is a test<RANDOM_TAG>

我希望获得[?q][?p] [?q]<之间的所有文字 是否有可能只用一种模式呢?

到目前为止我已经做到了这一点:

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

3 个答案:

答案 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

See it in action