【发布时间】:2021-04-21 17:00:52
【问题描述】:
我是新来的。我想问一个关于在 DialogFlow 中将 REGEX 用于实体的问题
我希望实体接受除符号 * 之外的所有文本和空格
我曾尝试使用 [A-Za-z0-9 ][^*],但它不起作用。任何建议。谢谢!
【问题讨论】:
-
你能提供一个你试图匹配的字符串的例子吗?
标签: dialogflow-es
我是新来的。我想问一个关于在 DialogFlow 中将 REGEX 用于实体的问题
我希望实体接受除符号 * 之外的所有文本和空格
我曾尝试使用 [A-Za-z0-9 ][^*],但它不起作用。任何建议。谢谢!
【问题讨论】:
标签: dialogflow-es
在您的正则表达式中,[^*] 表示“捕获行首的任何字符”。要引用文字星号而不是匹配任何字符,您需要使用\*
如果您想匹配您给出的[A-Za-z0-9] 示例中的一行字母或数字,但前提是该字符串不包含星号,那么此表达式应该适合您:
^[a-zA-Z0-9]+$
这意味着“匹配一整行文本,如果它只包含一个或多个字符 a-z、A-Z 或 0-9”。
如果你想匹配一行中除星号之外的任何字符或字符组,那么你可以使用这样的东西:
(?!\*)([a-zA-Z0-9]+)(?<!\*)
第一部分称为“负前瞻”,它期待确保我们不匹配星号。最后一部分被称为“消极的后视”,它向后看以确保我们不匹配星号。中间部分是您的“捕获组”,确认您匹配给定字符串中的任何字母或数字,但不包括 * 字符。
如果这个正则表达式得到像*abc 这样的输入,它将捕获abc。如果它遇到abc*,它仍然会捕获abc。如果遇到abc*def,它会在两个捕获组中分别捕获abc和def,因为它会绕过星号。
此链接解释了lookarounds in Regex 的概念。您还可以使用 this Regex tester 开始练习正则表达式,并解释每个字符块的作用。
编辑添加如果您只对匹配单个字符而不是字符组感兴趣,您可以使用[A-Za-z0-9] 并匹配任何大写或小写字母和任何单个数字。不需要排除* 字符,因为字符组已经是独占的了。
这与以下问题略有重复,因此此处的回答也可能对您有所帮助。希望这会有所帮助!
【讨论】:
[A-Za-z0-9 ][^*]
您的正则表达式将匹配 2 个连续字符。首先,它会寻找任何东西 A-Za-z0-9 。然后,它将查看包含 * 的否定集,并匹配除 * 之外的任何字符。
您可以在https://regexr.com/ 中键入您的正则表达式,以查看其匹配方式的细分并测试一些字符串。
例如,您的正则表达式将匹配这些:
Aa
AA
a&
A1
0_
但不会匹配这些:
A*
a*
1*
并且不会匹配超过 2 个字符的内容。如果你真的想用除 * 之外的任何字符匹配任何字符串,这应该可以:
[^\*]+
这将匹配任意数量的非 * 连续字符。 (+ 表示匹配集合中的 1 个或多个字符)。转义 * 也是一个好主意,因为它也是正则表达式中的保留字符。尽管大多数正则表达式解析器都足够聪明,可以知道在一个组中您可能指的是文字 char *,但最好还是逃避它。 (出于同样的原因,您可能希望使用 \s 而不是原始正则表达式中的空格。)
【讨论】: