当前位置: 首页 > 知识库问答 >
问题:

正则表达式中的词边界

孙承弼
2023-03-14

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

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

   // do something

}

我的目标是只验证数字(int和decimal),空格, ( ), 点,AND,OR。其他一切都是不允许的。它看起来像是工作的,但是我对单词边界\bAND\b和\bOR\b Eg有问题。我不能输入ANDWE或EEE或任何组合,但我能做的是AN或A。如何在字符串中只允许两个单词AND或OR?它们在字符串中是可选的。

输入示例

0.10和23-有效

12和(15或0.2)-有效

12或190-有效

第12条和第12条-有效

12 A 233-瓦利斯

共有2个答案

阴雪风
2023-03-14

不能使用一个正则表达式解析上下文无关语言

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

有对正则表达式引擎的扩展,您可以在其中使用内部堆栈。在SO上检查这个答案。

闻华容
2023-03-14

您需要数字、空格、括号、点和或。

下面是一种方法,通过在character类中指定单个字符,并使用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
 类似资料:
  • 问题内容: 我想在Elastisearch中使用单词边界进行正则表达式查询,但是看起来Lucene正则表达式引擎不支持。我可以使用哪些解决方法? 问题答案: 在ElasticSearch regex风格中,没有直接等效于单词边界的功能。最初是一样的东西,如果用一个字字符开始,并且尾部就像如果用一个字字符结束。 因此,我们需要确保在字符串的前后或字符串的开始/结束处有一个非单词char 。由于正则表

  • 问题内容: 我问这个问题有点傻,但是从我读过的所有内容来看,这应该有效,但对我而言却无效。我只是想使用正则表达式匹配字符串中的整个单词。 因此,如果我试图在句子中找到单词“ the”,则对于“褐狐快速越过懒狗”应该返回true,而对于“褐狐快速越过懒狗”则返回false。 。 我已经试过了: 我也尝试过: 我也尝试过此正则表达式:“ \ bthe \ b” 而且它们总是返回false。我觉得我在这

  • 问题内容: 我有一个像 我需要一个正则表达式给我以下输出: 我努力了 但这给 问题答案: 因此,您想要(+一个整数)后跟任何内容,直到下一个(或字符串结尾),对吗? 然后,您需要告诉正则表达式引擎: 在您的正则表达式中,尽可能匹配-直到字符串结尾的所有内容。另外,您将比赛的第二部分本身做了。 我的解决方案说明:

  • 问题内容: 我目前正在编写一个用于匹配内容中特定单词的库。 本质上,它的工作方式是将单词编译为正则表达式,然后通过所述正则表达式运行内容。 我要添加的功能是指定要匹配的给定单词是否必须以单词开头和/或结尾。例如,我有这个词。我指定它 必须开始一个字 ,因此将 匹配 的是在开始,但 不能匹配 为不启动的话。 我想使用单词边界来执行此操作,但是在进行一些测试时,我发现它无法正常运行。 采取以下措施,

  • 我正在尝试抓取模式中第一个连字符之后的文本 但在此模式中: 我希望它跳过‘不想要的’文本,并匹配的文本后面的下一个连字符(DesiredText)。我创建了一个具有两种模式regex101,并需要修改我的基本regex,以便如果中存在一个或多个我不想匹配的单词,那么它将匹配第二个连字符文本: https://regex101.com/r/vesqh3/1

  • 问题内容: 在JavaScript中: 正确地给我: 当我使用utf-8字符时: 在字边界运营商似乎没有工作时: 这个问题有方法解决吗? 问题答案: 仅当一个单词字符之前或之后没有另一个单词字符(因此等于和)时,单词边界声明才匹配。并且定义为。因此与希腊字符不匹配。因此,您不能在这种情况下使用。 相反,您可以使用以下方法: