由于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)|\\;";
但它没有用......
如果你能帮助我,我将感激不尽。
答案 0 :(得分:1)
基本上,您需要一个有效单词列表,然后是一个以;
开头的可选重复组和有效单词列表:
String regex = "^(?:\\b(?:VM|VF|TV|IM|IF)\\b)(?:;\\b(?:VM|VF|TV|IM|IF)\\b)*$";
这:
^
,在结尾使用$
以匹配完整输入。;
。您的所有示例都涉及至少两个"单词,"但是,如果这是一项要求,请在第二组中将*
(重复零次或多次)更改为+
(重复一次或多次)。 ...实际上,作为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"));
}
}
答案 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|;)++$