带有“或”运算符的正则表达式多字符串

时间:2015-02-11 22:20:20

标签: java regex

我需要建立一个能识别以下3种情况的java正则表达式:

  1. 以下字符的任何组合/数量:“ACTGactg:”
    1. 任何一个问题标记“?”
      1. 任何字符串“NTC”
      2. 我将列出我到目前为止所尝试的内容以及出现的错误。

        public static final VALID_STRING = "[ACTGactg:]*";
        // Matches the first case but not the second or third
        // as expected.
        
        public static final VALID_STRING = "\\?|[ACTGactg:]*";
        // Matches all 3 conditions when my understanding leads me to
        // believe that it should not except the third case of "NTC"
        
        public static final VALID_STRING = "?|[ACTGactg:]*";
        // Yields PatternSyntaxException dangling metacharacter ?
        

        我希望准确的是以下内容:

        public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]*";
        

        但我想确保如果我拿走“NTC”,任何“NTC”字符串都会显示为无效。

        以下是我用来测试这些正则表达式的方法。

        private static boolean isValid(String thisString){
            boolean valid = false;
            Pattern checkRegex = Pattern.compile(VALID_STRING);
            Matcher matchRegex = checkRegex.matcher(thisString);
            while (matchRegex.find()){
                if (matchRegex.group().length != 0){
                    valid = true;
                }
            }
            return valid;
        }
        

        所以这是我的结束问题:

        1. 可以“\\?”正则表达式可能是一个接受“NTC”字符串的外卡字符吗?

        2. 是运算符“|”适合吗?

        3. 使用这些或运算符时是否需要使用括号?

        4. 以下是一些示例传入字符串:

          • A:C
          • T:G ^
          • AA:CC
          • T:C:甲:ģ
          • NTC

          谢谢

2 个答案:

答案 0 :(得分:2)

是的,所提供的正则表达式是可以的:

public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]+";

...

boolean valid = str.matches(VALID_STRING);

如果从正则表达式中删除NTC|,则字符串NTC将变为无效。

您可以对其进行测试并亲自体验here

答案 1 :(得分:2)

由于您使用的是Matcher.find()方法,因此您需要在字符串中的任何位置查找您的模式。

这意味着字符串A:CT:GAA:CC等完全匹配。但NTC怎么样?

匹配是因为find()在任何地方寻找匹配。它的TC部分匹配,因此您获得true

如果您只想完整匹配字符串,请使用match()方法,或使用^$

请注意,如果您将模式更改为[ACTGactg:]+而不是[ACTGactg:]*,则无需检查匹配是否超过0。