Regex:匹配8个字符单词,其中至少包含一个数字或一个特定符号的3个示例

p1tboqfb  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(167)

我试图创建一个正则表达式,匹配8个字符的单词,其中包含至少3个数字或'%'符号和单词后的空格的示例。
以下字符串应匹配:

  • 'ab1d2f3h '
  • 'ab%d2f3h '
  • 'ab%d%f3h '
  • 'ab%d%f%h '

到目前为止,我的正则表达式看起来像这样:

const string = 'this word ab1d2f3h needs to go, but not this word abcdefgh %%%'.replace(/(?=(?:\D*(\d|%)){3})(\w|%){8}\s/g, '%%%%%%%% ')

如果我从字符串中删除'%%%',它会工作- 'ab 1d 2f 3 h'被替换。但是,如果'%%%'出现在字符串中,它也会替换'abcdefhg ',这是我不希望发生的。
有人知道正确的正则表达式吗?

c0vxltue

c0vxltue1#

如果在使用模式的环境中支持后向Assert:

(?<!\S)(?=\S{8}\s)(?:[^\s\d%]*[%\d]){3}\S*

说明

  • (?<!\S)正向后看,向左Assert空白边界
  • (?=\S{8}\s)正向前看,Assert8个非空格字符,后跟一个空格字符(注意,它也可以匹配换行符)
  • (?:[^\s\d%]*[%\d]){3}重复3次,匹配除数字或%以外的任何非空格字符,然后匹配数字或%
  • \S*匹配可选的非空白字符

Regex demo
或者使用捕获组:

(^|\s)(?=\S{8}\s)(?:[^\s\d%]*[%\d]){3}\S*

Regex demo
在替换中,使用第一个捕获组来保留前导空格字符。

const string = 'this word ab1d2f3h needs to go, but not this word abcdefgh %%%'.replace(/(^|\s)(?=\S{8}\s)(?:[^\s\d%]*[%\d]){3}\S*/g, '$1%%%%%%%%')
console.log(string)
pxq42qpu

pxq42qpu2#

我问了ChatGPT,它回答了我的问题:
您可以使用以下正则表达式来匹配包含至少3个数字或符号“%”示例的8个字符的单词:

\b(?=(\w*[\d%]){3})\w{8}\b

说明:

  • \B匹配单词边界以确保正则表达式只匹配整个单词。
  • (?=(\w*[\d@]){3})是一个肯定的前瞻Assert,它检查单词中是否存在至少3个数字或符号'@'的示例。
  • \w{8}匹配任意8个单词字符(字母、数字和下划线)。
  • \B匹配单词边界的结尾。

注意,这个正则表达式假设字符串中没有空格或其他非单词字符。如果有,您可能需要修改正则表达式来处理它们。

相关问题