正则表达式分号和单词

时间:2016-11-25 11:14:38

标签: java regex

由于Java中的一些正则表达式,我面临一些困难。我想要一个表达式验证一个或多个单词是否有效并由分号分隔。

示例:

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

我试过这个:

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

但它没有用......

如果你能帮助我,我将感激不尽。

3 个答案:

答案 0 :(得分:1)

基本上,您需要一个有效单词列表,然后是一个以;开头的可选重复组和有效单词列表:

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

这:

  • 在开头使用^,在结尾使用$以匹配完整输入。
  • 从VM,VF,TV,IM或IF开始,两边都有字边界断言。
  • 然后允许零个或多个重复,前面有;。您的所有示例都涉及至少两个"单词,"但是,如果这是一项要求,请在第二组中将*(重复零次或多次)更改为+(重复一次或多次)。

...实际上,作为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 :(得分:1)

此代码可能比大型RegEx更容易理解和修改。

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;
    }
}

答案 2 :(得分:0)

与接受的答案相同,但有点崩溃:

^(?:VF|VM|IF|TV|IM|;)++$