正则表达式分号和单词

问题描述 投票:2回答:3

由于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)|\\;";

但它不起作用....

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

java regex
3个回答
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
投票

与大型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;
    }
}

0
投票

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

^(?:VF|VM|IF|TV|IM|;)++$
© www.soinside.com 2019 - 2024. All rights reserved.