2015-02-11 107 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

    相關問題