【问题标题】:Create regular expression from natural language从自然语言创建正则表达式
【发布时间】:2015-08-20 15:53:43
【问题描述】:

我想知道在哪里可以从 Java 中的自然语言创建正则表达式。为了解释这一点,让我举一个用例。

支持我要检查以下字符串的格式是否正确。

"aaaa-bbbb-cccc"

本例中有效字符串的业务定义如下:

4 letters, then hyphen, then 4 letters, then hyphen, then 4 letters.

实现这一点的常用方法是从业务中获取需求并相应地编写正则表达式。但我很想知道是否有任何库可用于从自然语言创建正则表达式。这样我们就可以要求企业以他们也能理解的方式提供格式。

【问题讨论】:

  • 您可能想使用编译器编译器,如 ANTLR、YACC 等。这将为您提供更大的灵活性。
  • 您可以通过构建器模式实现一个相对简单的 DSL
  • 一般来说,提供一种“自然语言”的方式来编写任何严格的规范是一个非常非常困难的问题。人们已经就这些主题撰写了博士论文。
  • 其实不是。自然语言没有顺序。即使某些东西具有较小的可重复性,也几乎不可能获得可用的机器创建的正则表达式。并且正则表达式结构本身是有限的,通常是复杂的非正则表达式算法的基础。
  • 如果您让业务人员编写这些内容,您将无法让他们遵守某些严格的语法,即使该语法比正则表达式简单得多并且更像自然语言。指定与您的示例相同的内容的有效定义可能是“应该是三组,每组四个字母,用破折号分隔”

标签: java regex


【解决方案1】:

您可能想看看可用于 Java 的业务规则引擎:DroolsJessEasyRules。在业务规则引擎中,您可以定义从业务中获得的需求(规则),然后对照它们检查传入的数据(事实)。

【讨论】:

  • 这可能适用于所描述的情况,但它不是正则表达式。 OP可以澄清正则表达式的需要吗?
【解决方案2】:

您可能想查看simply-regex 库。

这就是您可以在代码中创建正则表达式的方式,这将是不言自明的。您可以根据您的要求使用可读代码构建一次,而不是使用带有类型字符串的正则表达式变量。以后也很容易更改。

String builtRegex = SimpleRegex.regex().startingWith().exactString("abc")
                                   .then().oneOfTheCharacters('d', 'e', 'f')
                                   .build(); 
Pattern pattern = Pattern.compile(builtRegex); 
boolean isMatch = pattern.matcher(testString).matches();

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2020-03-29
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2010-10-01
    • 2013-11-18
    • 2019-10-26
    相关资源
    最近更新 更多