正则表达式中的单词边界

时间:2014-04-22 21:37:14

标签: java regex

我使用以下正则表达式:

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

2 个答案:

答案 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