gpt4 book ai didi

regex - RE2 (Rust) 正则表达式不能按预期工作

转载 作者:行者123 更新时间:2023-11-29 08:14:34 25 4
gpt4 key购买 nike

我有一个看似简单但不按要求运行的正则表达式。要解析的输入描述如下(注意:{} 不是正则表达式的一部分,只是里面的内容):

  • 0 个或多个空格的序列 {\s*}
  • 破折号{-}
  • 0 个或多个空格的序列 {\s*}
  • 一个人的全名(名字、中间名、姓氏;都包含在 f1 中)。名称不能以数字开头必须出现在行尾 {[A-Za-z][\w\s]*)}

整个构造 SPACE-SPACEf1 是可选的

只是为了解释捕获到 f1 中的内容:对于第一个字符,我使用由 [A-Za-z] 表示的字符集。后跟\w 或空格 0 次或多次。这被捕获到 f1 中。

(?:\s*-\s*(?P<f1>[A-Za-z][\w\s]*))?$

我希望以下序列匹配并将值捕获到 f1 中:

  • "- 布鲁斯"(f1=布鲁斯)
  • “-布鲁斯·狄金森”(f1=布鲁斯·狄金森)

我希望以下内容不匹配:

  • “Bruce”(没有前导破折号)
  • “-布鲁斯!” (在名称之后和行尾之前有一个非单词 (\w) 字符

我期待以下匹配但没有将值捕获到 f1 中(尽管我希望它不匹配):

  • "- 1Bruce"(前导字符为数字)

这些是实际结果:

  • "- Bruce"(f1=Bruce) 勾选;这行得通
  • "- Bruce Dickinson"(f1=Bruce Dickinson) Tick;这行得通

  • “Bruce”(f1=未捕获,但表达式匹配。这是错误的,因为 Bruce 不匹配可选部分,而 $ 紧随其后,与 Bruce 不匹配)

  • “- 布鲁斯!” (f1= not cpatured, but expression is a match;这是错误的,因为 !,这意味着匹配没有出现在行尾。

我希望:

(?:\s*-\s*(?P<f1>[A-Za-z][\w\s]*))?

将消耗 { - Bruce},它应该离开 !,它应该失败,因为下一个正则表达式标记是 $;然而,电脑说不,所以我错了,但我不知道为什么:(

  • "- 1Bruce"(f1= not captured, but expression is match. 这是可以理解的,因为整个 {space dash space f1} 序列是可选的,因为它不匹配,所以跳过该构造,然后什么都没有否则处理输入;我们到达行尾)

如果我能让它发挥作用,我就能让我的其余表达式按照我想要的方式发挥作用。我需要其他人来让我以不同的方式思考这个问题。我已经在这上面花了 2 天时间,但没有任何积极的成果,非常令人沮丧。

PS:我正在使用 regex101.com 来测试正则表达式。正则表达式将用作 Rust 应用程序的一部分,其正则表达式引擎基于谷歌的 RE2。

最终,我需要能够识别由 & 分隔的一系列名称,并且整个表达式是可选的,可以使用 ?并且必须出现在 $ 行的末尾。

所以

  • { - Bruce & Nicko & Dave Murray } 有效

  • { - Bruce & Nicko & Dave Murray & } 无效且不匹配

但一次只做一步!

最佳答案

这里的要点是你不能同时匹配和不匹配某些东西。如果您将整个模式设置为可选,并且字符串的结尾是强制性的,即使没有任何感兴趣的内容,字符串的结尾也会被匹配——总是如此。

出路是想一个你感兴趣的子模式。你对名字感兴趣,所以,让第一个字母成为强制性的。在您提供的所有测试用例中,连字符似乎也是强制性的。其他一切都可以是可选的:

\s*-\s*(?P<f1>([^\W\d_])\w*(?:\s+\w+)*)(?:\s*&\s*(?P<f2>([^\W\d_])\w*(?:\s+\w+‌​)*))*$

参见 regex demo (\s 被替换为 \h 并且 \n 添加到否定字符类只是为了演示目的,因为它是一个多行演示) .

请注意,我将 [a-zA-Z] 替换为 [^\W\d_] 以使模式更加灵活([^\W\d_] 只匹配任何字母)。

关于regex - RE2 (Rust) 正则表达式不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com