【问题标题】:Dialogflow RE2 RegexDialogflow RE2 正则表达式
【发布时间】:2021-04-21 17:00:52
【问题描述】:

我是新来的。我想问一个关于在 DialogFlow 中将 REGEX 用于实体的问题

我希望实体接受除符号 * 之外的所有文本和空格

我曾尝试使用 [A-Za-z0-9 ][^*],但它不起作用。任何建议。谢谢!

【问题讨论】:

  • 你能提供一个你试图匹配的字符串的例子吗?

标签: dialogflow-es


【解决方案1】:

在您的正则表达式中,[^*] 表示“捕获行首的任何字符”。要引用文字星号而不是匹配任何字符,您需要使用\*

如果您想匹配您给出的[A-Za-z0-9] 示例中的一行字母或数字,但前提是该字符串不包含星号,那么此表达式应该适合您:

^[a-zA-Z0-9]+$

这意味着“匹配一整行文本,如果它只包含一个或多个字符 a-z、A-Z 或 0-9”。

如果你想匹配一行中除星号之外的任何字符或字符组,那么你可以使用这样的东西:

(?!\*)([a-zA-Z0-9]+)(?<!\*)

第一部分称为“负前瞻”,它期待确保我们不匹配星号。最后一部分被称为“消极的后视”,它向后看以确保我们不匹配星号。中间部分是您的“捕获组”,确认您匹配给定字符串中的任何字母或数字,但不包括 * 字符。

如果这个正则表达式得到像*abc 这样的输入,它将捕获abc。如果它遇到abc*,它仍然会捕获abc。如果遇到abc*def,它会在两个捕获组中分别捕获abcdef,因为它会绕过星号。

此链接解释了lookarounds in Regex 的概念。您还可以使用 this Regex tester 开始练习正则表达式,并解释每个字符块的作用。

编辑添加如果您只对匹配单个字符而不是字符组感兴趣,您可以使用[A-Za-z0-9] 并匹配任何大写或小写字母和任何单个数字。不需要排除* 字符,因为字符组已经是独占的了。

这与以下问题略有重复,因此此处的回答也可能对您有所帮助。希望这会有所帮助!

How can I exclude asterisk in a regex expression

【讨论】:

    【解决方案2】:
    [A-Za-z0-9 ][^*]
    

    您的正则表达式将匹配 2 个连续字符。首先,它会寻找任何东西 A-Za-z0-9 。然后,它将查看包含 * 的否定集,并匹配除 * 之外的任何字符。

    您可以在https://regexr.com/ 中键入您的正则表达式,以查看其匹配方式的细分并测试一些字符串。

    例如,您的正则表达式将匹配这些:

    Aa
    AA
    a&
    A1
    0_
    

    但不会匹配这些:

    A*
    a*
    1*
    

    并且不会匹配超过 2 个字符的内容。如果你真的想用除 * 之外的任何字符匹配任何字符串,这应该可以:

    [^\*]+
    

    这将匹配任意数量的非 * 连续字符。 (+ 表示匹配集合中的 1 个或多个字符)。转义 * 也是一个好主意,因为它也是正则表达式中的保留字符。尽管大多数正则表达式解析器都足够聪明,可以知道在一个组中您可能指的是文字 char *,但最好还是逃避它。 (出于同样的原因,您可能希望使用 \s 而不是原始正则表达式中的空格。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2019-07-17
      • 2021-05-30
      • 1970-01-01
      • 2015-10-17
      • 2019-10-09
      • 2011-10-31
      • 2015-12-15
      相关资源
      最近更新 更多