2015-02-11 145 views
0

我需要建立一个Java正则表达式,将认识到以下3种情况:正则表达式的多个字符串用“或”运算符

  1. 下列字符的任意组合/金额:“ACTGactg:”

  1. 任何单个问号“?”

  • 任何字符串 “NTC”
  • 我会列出我迄今为止尝试和错误已出现。

    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. 使用这些或操作符时是否需要使用括号?

    下面是一些例子传入字符串:

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

    谢谢

    +0

    既然你有一个建议的解决方案,为什么不测试它,看看它是否工作,并试着用括号和不用括号? – DNA 2015-02-11 22:25:00

    +0

    您使用哪种对象/方法来测试字符串? – RealSkeptic 2015-02-11 22:25:51

    +0

    @DNA伟大的一点。我尝试了许多不同的组合,并失去了所有单项结果的踪迹。我想我在问什么是规则/惯例。 – Malonge 2015-02-11 22:27:15

    回答

    2

    是所提供的正则表达式将是确定的:从正则表达式的字符串NTC变为无效

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

    ...

    boolean valid = str.matches(VALID_STRING); 
    

    如果您删除NTC|

    您可以测试它并试验自己here

    +0

    或者使用'matches'而不是'find'。 'find'查找任何子字符串,'matches'不会。 – immibis 2015-02-11 22:44:09

    +0

    你说得对,'匹配'不需要行开始和结束锚,我相应地修改了答案。 – ntrp 2015-02-11 22:47:36

    +0

    我想我想继续查找,因为它对我在程序中检查的其他正则表达式很有帮助,所以我将在使用锚定方法时继续查找。 – Malonge 2015-02-11 22:49:23

    2

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

    这意味着字符串A:C,T:G,AA:CC等等完全匹配。但如何NTC

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

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

    请注意,如果将模式更改为[ACTGactg:]+而不是[ACTGactg:]*,则不必检查匹配是否大于0。

    +0

    谢谢你的深入解释这肯定是有道理的。 – Malonge 2015-02-11 22:53:15