私はjavaの正規表現のためにいくつかの問題に直面しています。 1つ以上の単語が有効で、セミコロンで区切られているかどうかを検証する式が必要です。Regexのセミコロンと単語
例:
VF;VM - Good
VF;GM - Bad
VF,VM - Bad
VF;VM;IF - Good
VF,VM;IF - Bad
私はこの1つ試してみました:あなたは私を助けることができる場合、私は基本的に
私はjavaの正規表現のためにいくつかの問題に直面しています。 1つ以上の単語が有効で、セミコロンで区切られているかどうかを検証する式が必要です。Regexのセミコロンと単語
例:
VF;VM - Good
VF;GM - Bad
VF,VM - Bad
VF;VM;IF - Good
VF,VM;IF - Bad
私はこの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)*$";
こと:
^
と$
を使用します。*
(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"));
}
}
アンカーのため、ここではワード境界は必須ではありません – Toto
@Toto:良い点。 –
ニース。可能な単語の数に応じて、有効な単語のString []から正規表現を生成することをお勧めします。 –
このコードは大きな正規表現よりも理解し、修正しやすいかもしれません。
受け入れ答えと同じ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;
}
}
が、少しダウン崩壊:
^(?:VF|VM|IF|TV|IM|;)++$
なぜ 'VF; VM'は良好であり、' VF; GM'が悪いのですか? – Toto
'VF; VM; IF;'についてはどうですか? –
@Toto:試してみると、それは単なるリストであり、いくつかは有効であり、そうでないものもあります。 –