2016-11-25 8 views
2

私はjavaの正規表現のためにいくつかの問題に直面しています。 1つ以上の単語が有効で、セミコロンで区切られているかどうかを検証する式が必要です。Regexのセミコロンと単語

例:

VF;VM - Good 
VF;GM - Bad 
VF,VM - Bad 
VF;VM;IF - Good 
VF,VM;IF - Bad 

私はこの1つ試してみました:あなたは私を助けることができる場合、私は基本的に

+2

なぜ 'VF; VM'は良好であり、' VF; GM'が悪いのですか? – Toto

+0

'VF; VM; IF;'についてはどうですか? –

+0

@Toto:試してみると、それは単なるリストであり、いくつかは有効であり、そうでないものもあります。 –

答えて

1

thankfullなります

String regex = "(\\bVM\\b|\\bVF\\b|\\bTV\\b|\\bIM\\b|\\bIF\\b)|\\;"; 

しかし、いけない仕事....

を有効な単語のリストが必要な場合は、で始まるオプションの繰り返しグループを作成します、有効な単語のリスト:

String regex = "^(?:\\b(?:VM|VF|TV|IM|IF)\\b)(?:;\\b(?:VM|VF|TV|IM|IF)\\b)*$"; 

こと:

  • は全入力に合わせて、最後に先頭に^$を使用します。
  • VM、VF、TV、IM、またはIFで開始し、いずれかの側でワード境界アサーションを使用します。
  • その後、の前に0回以上の繰り返しを許可します。すべての例には少なくとも2つの「単語」が含まれています。したがって、それが必要な場合は、*(0回以上繰り返し)を第2グループの+(1回以上繰り返します)に変更してください。

...そして実際に、Toto points outとして、我々はアンカーを使用して、特定のセパレータ(;)を定義していることから、我々は、単語の境界を必要としないので、単に

String regex = "^(?:VM|VF|TV|IM|IF)(?:;(?:VM|VF|TV|IM|IF))*$"; 

..十分であり、より単純である。

Example on regex101 (as a JavaScript regex)

テスト:

class Example 
{ 
    private static String regex = "^(?:VM|VF|TV|IM|IF)(?:;(?:VM|VF|TV|IM|IF))*$"; 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     test("VF;VM", true); 
     test("VF;GM", false); 
     test("VF,VM", false); 
     test("VF;VM;IF", true); 
     test("VF,VM;IF", false); 
    } 

    private static void test(String str, boolean expectedResult) { 
     boolean result = str.matches(regex); 
     System.out.println(str + " -- " + (result ? "Good" : "Bad") + (result == expectedResult ? " - OK" : " - ERROR")); 
    } 
} 

Live on ideone

+1

アンカーのため、ここではワード境界は必須ではありません – Toto

+1

@Toto:良い点。 –

+1

ニース。可能な単語の数に応じて、有効な単語のString []から正規表現を生成することをお勧めします。 –

1

このコードは大きな正規表現よりも理解し、修正しやすいかもしれません。

受け入れ答えと同じ
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 


public class ValidateList 
{ 
    public static void main(String[] args) { 
     Set<String> validWords = new HashSet<String>(Arrays.asList(new String[] { "VM", "VF", "TV", "IM", "IF" })); 
     System.out.println(areAllWordsValid("VF;VM;IF", validWords)); 
     System.out.println(areAllWordsValid("VF;VM;IF;", validWords)); 
     System.out.println(areAllWordsValid("VF;GM;IF", validWords)); 
    } 

    public static boolean areAllWordsValid(String string, Set<String> validWords) { 
     String[] words = string.split(";", -1); 
     for (String word : words) { 
      if (!validWords.contains(word)) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 
0

が、少しダウン崩壊:

^(?:VF|VM|IF|TV|IM|;)++$ 
関連する問題