Java 正则分号和单词

Java 正则分号和单词,java,regex,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)|\\;"; 但它不起作用 如果您能帮助我,我将不胜感激。基本上,您需要一个有效单词的列表,然后是一个可

由于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)|\\;";
但它不起作用


如果您能帮助我,我将不胜感激。

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

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

  • 在开头使用
    ^
    ,在结尾使用
    $
    ,以匹配完整输入
  • 以VM、VF、TV、IM或IF开头,两边都有单词边界断言
  • 然后允许使用
    进行零次或多次重复在它前面。但是,您的所有示例都至少涉及两个“单词”,因此如果这是一个要求,请在第二组中将
    *
    (重复零次或多次)更改为
    +
    (重复一次或多次)
…事实上,由于我们使用了锚并定义了一个特定的分隔符(
),所以我们不需要单词边界,所以非常简单

String regex = "^(?:VM|VF|TV|IM|IF)(?:;(?:VM|VF|TV|IM|IF))*$";
…足够了,而且更简单

测试:

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

此代码可能比大型正则表达式更容易理解和修改

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;
    }
}
导入java.util.array;
导入java.util.HashSet;
导入java.util.Set;
公共类验证列表
{
公共静态void main(字符串[]args){
Set validWords=newhashset(Arrays.asList(新字符串[]{“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));
}
公共静态布尔值areAllWordsValid(字符串、设置有效字){
String[]words=String.split(“;”,-1);
for(字符串字:字){
如果(!validWords.contains(word)){
返回false;
}
}
返回true;
}
}

与公认的答案相同,但有点崩溃:

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

为什么
VF;VM
良好且
VF;GM
不好?VF怎么样;虚拟机;如果
?@Toto:看看这个尝试,它只是一个列表,有些是有效的,有些不是;GM是无效的,因为GM在有效的单词列表上…好的,但是列表在哪里?这里单词边界不是强制性的,因为主持人尼斯。根据可能的单词数量,从有效单词的字符串[]生成正则表达式可能是一个好主意。是的,我正在寻找正则表达式,工作正常谢谢!我可以在pl sql中使用这个正则表达式吗?