如何提取正则表达式的第一部分?

时间:2019-08-27 11:52:09

标签: java regex

在我们的应用程序中,我们增加了用户使用正则表达式进行搜索的功能。但是,我们需要验证用户提交的正则表达式字符串。

对此正则表达式字符串我需要做的一项限制/检查是确保所提交模式的第一个匹配部分不包含任何通配符(例如。*)。本质上,我们要确保在任何正则表达式开始之前存在文字前缀。 (我知道,就正则表达式而言,这似乎有点奇怪。但是,如果执行此规则,我们会发现硬件的性能要高得多。)

我想要做的是以某种方式将提交的正则表达式字符串分解为各个匹配的部分,提取其中的第一个,并对照预定义的字符串列表检查其内容。如果它包含这些预定义的字符串之一,它将失败,并且将在搜索开始时告知用户不允许使用特定类型的字符串。

一个非常基本的例子: 如果用户提交了字符串“。* [A-Z} {4} [0-9] {3}” 这可以分为三个“匹配”部分:

  • 。*
  • [A-Z] {4}
  • [0-9] {3}

如果您将字符串“。* [AZ} {4} [0-9] {3}”插入到regex101网站中,它会进行分析并给出解释,这是我想要做的一个很好的演示在右侧,分解正则表达式字符串的每个部分。本质上,这是我需要在Java代码中复制的行为-如果可能的话。

我曾经研究过使用Pattern和Matcher类。希望可以以某种方式细分提交的模式,例如

private void checkForWildcardCharacter(String regexQuery) {
        Pattern pattern = Pattern.compile(regexQuery);      
        // get section 1 of compiled pattern
        if (regexQuerySection1.startsWith(".*")) {
            // throw ValidationFailed exception with explanation;
        }
}

我知道您可以从Matcher对象中提取匹配的组,但这是针对字符串运行模式的结果。

希望所有事情都有道理-第一次在SO上发布问题,因此可能错过了一些有用的部分。

欣赏它。

现在

更新,我不得不创建单独的验证器类,该验证器类基本上针对用户提交的regex字符串运行一组regex字符串。基本上每个人都要检查以确保用户正则表达式的第一个“部分”遵守我们必须对搜索功能施加的限制。 例如,正则表达式不允许以通配符部分(即。*,。+,[A-Za-z0-9] *等)开头。

感谢您到目前为止的信息,非常感谢。 如果有人有其他想法,请告诉我,因为我目前的解决方案还有些粗糙。

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用ANTLR这样的解析语言?这里有一个BNF可用于实现此目的:https://www2.cs.sfu.ca/~cameron/Teaching/384/99-3/regexp-plg.html

然后,您只需要验证AST没有通配符节点即可。

答案 1 :(得分:-1)

我认为下面的示例将为您提供提示。

x

控制台:

  

112

     

5

     

64

     

999