我使用以下正则表达式:
if (input.matches("^[\\d\\s()\bAND\b\bOR\b.]+$")) {
// do something
}
我的目标是仅验证数字(整数和十进制),空格,(),点,和,或。 其他一切都是不允许的。 看起来它有效,但我遇到了字边界\ bAND \ b和\ bOR \ b的问题 例如。我无法进入ANDWE或EEE或任何组合,但我可以做的是AN或A. 我如何只在字符串中允许两个单词AND或OR?它们在字符串中是可选的。
输入示例
0.10 AND 23 - 有效
12 AND(15 OR 0.2) - 有效
12 OR 190 - 有效
12 AND AND 12 - 有效
12 A 233 - invalis
答案 0 :(得分:1)
您需要数字,空格,括号,点和AND以及OR。
这是一种方法,通过指定字符类中的单个字符,并使用OR运算符|
分隔这两个单词。请注意,\b
已转义\
,因为\b
本身就是字符串转义序列。
if (input.matches("^([\\d\\s().]|\\bAND\\b|\\bOR\\b)+$")) {
// do something
}
这是您输入的测试程序。
import java.util.regex.*;
public class Main{
public static void main(String[] args) {
String[] myArray = new String[] {"0.10 AND 23","12 AND (15 OR 0.2)","12 OR 190","12 AND AND 12","12 A 233"};
String regex = "^([\\d\\s().]|\\bAND\\b|\\bOR\\b)+$";
for (int i = 0; i < myArray.length; i++)
System.out.println(myArray[i].matches(regex));
}
}
输出:
true
true
true
true
false
答案 1 :(得分:0)
您无法使用一个正则表达式解析无上下文语言。
最简单的演员是括号平衡。您无法检测仅由括号组成的字符串是否正确平衡。例如,&#34;()(()())&#34;。只使用一个正则表达式无法检测此字符串是否正确。
正则表达式引擎有扩展,您可以使用内部堆栈。 Check this answer on SO