【问题标题】:Word boundary in regular expression正则表达式中的单词边界
【发布时间】:2014-06-07 11:34:26
【问题描述】:

我正在使用以下正则表达式:

if (input.matches("^[\\d\\s()\bAND\b\bOR\b.]+$")) {

   // do something

}

我的目标是仅验证数字(整数和小数)、空格、( )、点、AND、OR。 其他一切都是不允许的。 似乎它有效,但我遇到了单词边界 \bAND\b 和 \bOR\b 的问题 例如。我不能不输入 ANDWE 或 EEE 或任何组合,但我能做的是 AN 或 A。 如何在一个字符串中只允许两个单词 AND 或 OR?它们在字符串中是可选的。

输入示例

0.10 AND 23 - 有效

12 AND (15 OR 0.2) - 有效

12 或 190 - 有效

12 AND AND 12 - 有效

12 A 233 - 无效

【问题讨论】:

  • 你不能在字符类[]中使用单词。
  • 您的输入看起来如何?举几个例子!我的意思是它必须是有效的数学表达式还是任何序列 f.e. “AND AND OR 333435553”符合条件
  • 不,它不应该是有效的数学,只有 AND 和 OR 接受的词
  • 好的。我假设您还必须验证表达式?也许您可以创建一个简单的 Parser 类,如果出现不正确的字符则返回错误?无论如何,您都需要检查括号是否匹配等...
  • 检查一下解析和评估表达式:stackoverflow.com/questions/13421424/…

标签: java regex


【解决方案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

【讨论】:

  • 如果我输入 4343 AND 213 它不允许我,返回 false
  • @antohoho,我刚刚添加了额外的转义。再试一次。
【解决方案2】:

您无法使用一个正则表达式解析上下文无关语言。

最简单的转换是括号平衡。您无法检测仅由括号组成的字符串是否正确平衡。例如, ”()(()())”。仅使用一个正则表达式无法检测此字符串是否正确。

正则表达式引擎有一些扩展,您可以在其中使用内部堆栈。 Check this answer on SO.

【讨论】:

  • 好点。感谢您的链接。我只是还没有尝试在这里解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2018-07-09
  • 1970-01-01
  • 2011-04-14
  • 2011-03-28
  • 2012-09-24
相关资源
最近更新 更多