gpt4 book ai didi

如果不是最后一个单词,则正则表达式不匹配该单词

转载 作者:行者123 更新时间:2023-12-03 23:16:28 25 4
gpt4 key购买 nike

我正在尝试编写一个正则表达式,它可以将字符串中的单词与这些条件匹配:

  1. 单词长度必须为 8 个字符。
  2. 该单词在任意位置都必须有 1 个字母字符词。
  3. 该单词的任何位置都必须有 7 位数字。

\b(?=\w{8}\z)(?=[^a-zA-Z]*[a-zA-Z]{1})(?=(?:[\D]*[\d]){7}).*\b

这可以找到“123r1234”“foo 123r1234”,但找不到“foo bar 123r1234 foo”。我尝试添加单词边界,但没有成功。我的正则表达式有什么问题,我该如何修复它?

谢谢。

最佳答案

您可以使用以下正则表达式:

\b(?=[^a-zA-Z]*[a-zA-Z])(?=(?:\D*\d){7})\w{8}\b

参见demo

这里有几点需要注意:

  1. 没有必要将单个速记类(如 \d)包含到字符类中(模式变得太尴尬且可读性较差)。因此,请使用 \D 而不是 [\D]
  2. 先行次数的规则应等于条件数 - 1(请参阅 Fine-Tuning: Removing One Condition at rexegg.com )。大多数情况下,只有 1 个字符/字符类的长度限制前瞻是移植到基本模式中的有效候选者。在这里,(?=\w{8}) 可以轻松替换末尾的 .*
  3. (?=\w{8}\z) 前瞻包含一个字符串结尾 \z anchor ,该 anchor 强制在字符串末尾进行匹配字符串,而您需要(据我现在所知)单词的结尾
  4. [a-zA-Z]{1} 等于 [a-zA-Z],因为 {1} 表示 *恰好是一个重复,而且是多余的(同样,正则表达式模式应该尽可能干净和简洁)。

更新(+1 转到@Jonny5)

还有另一种方法可以解决当前问题:让单词包含 8 个单词字符,但仅匹配 1 个包含任意数字的字母。这可以通过以下方式实现:

(?i)\b(?=\w{8}\b)\d*[a-z]\d*\b

参见another demo (注意这里使用了i修饰符)

关于如果不是最后一个单词,则正则表达式不匹配该单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265512/

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