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