【问题标题】:Error in pattern in Watson Assistant EntityWatson Assistant 实体中的模式错误
【发布时间】:2020-02-10 11:58:33
【问题描述】:

我正在尝试为 Watson Assistant 实体创建一个正则表达式模式,以检测类似于粗体的日期:

  • 日期 25/2/2020 30/2/2020
  • 日期 /25/2 30/2
  • 日期 18/02
  • 日期 12/12/
  • 日期 12/12/
  • 日期 12/12

我使用了以下表达式来做到这一点:

( \b(?:3[01]|[12][0-9]|0?[1-9])([\-/.])(1[1-2]|0?[1-9])(?![\-/.])\b )

这个表达式很好用,问题是 Watson 中使用的模式比较引擎有语法限制。

实体模式不能包含:

  • 正向重复(例如,x*+)
  • 以前的引用(例如,\g1)
  • 条件分支(例如,(? (Cond) true))

此时,我不能使用 (?![-/.]) 来避免像“25/02/2020”这样的日期。

我该怎么做?

提前致谢,

【问题讨论】:

  • 您的模式基于什么正则表达式引擎?您是否尝试过将其转换为 Java 正则表达式? docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
  • 正则表达式引擎松散地基于Java正则表达式引擎。 (cloud.ibm.com/docs/services/…)
  • 匹配日期的实际规则(用人类的话来说)是什么?我发现很难理解您需要/打算做什么。
  • 只有当格式为日/月时才需要匹配。如果是日/月/年,则无效。

标签: regex ibm-watson watson-assistant


【解决方案1】:

你可以试试这个:

[ ]((?:3[01]|[12][0-9]|0?[1-9])([\-/.])(1[1-2]|0?[1-9]))(?:$|[^\d\-/.])

我假设您需要在问题中使用的不同捕获组。如果不是这种情况,您可以删除它们或将它们替换为非捕获组(?:)

我还假设你不需要捕获捕获组上的空间,所以我把它放在一边。

所以基本的想法是,在你的表达之前,你可能想找到字符串/行的结尾$或一些不是数字的字符,-/.

【讨论】:

    【解决方案2】:

    首先这种方式可能只在美国有效(我用不同的$timezone 尝试过但没有用,但这可能是一个“尝试一下”的问题)。

    打开@sys-date。如果您的用户说“日期 02/18”,它将选择 02/18 作为 2020-02-18。然后,您可以更轻松地处理日期。

    另一种方法是创建一个云函数来为您执行复杂的正则表达式并将其交还给 Watson Assistant。

    【讨论】:

      【解决方案3】:

      我没有用于测试的 Watson Assistant 实体,但这应该可以:

      \s\d?\/\d?\s
      

      \s\d{1,2)\/\d{1,2}\s
      

      \s(\d|\d\d)\/(\d|\d\d)\s
      

      \s 是空格,\d 是任意数字

      该站点没有提供具有正则表达式引擎功能的适当手册(至少,我没有找到它)。因此,我针对上述限制提供了解决方法。


      它不能验证日期是否真实,但由于 30/2(2 月 30 日)是有效匹配,所以应该没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 2019-02-24
        相关资源
        最近更新 更多