Regex:匹配包含至少3个数字或特定符号实例的8个字符单词



我正在尝试创建一个匹配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, '%%%%%%%% ')

如果我从字符串中删除'%%%',它会工作- 'ab1d2f3h '被替换。但是,如果字符串中存在'%%%',它也会替换'abcdefhg ',这是我不希望发生的。

有人知道这个正确的正则表达式吗?

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

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

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

Regex演示

或者使用捕获组:

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

Regex演示

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

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

询问ChatGPT,它回答了我的问题:

您可以使用以下正则表达式匹配包含至少3个数字或符号"%"实例的8个字符的单词:

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

解释:

  • b匹配单词边界以确保正则表达式只匹配整个单词。
  • (?=(w*[d@]){3})是一个正向前看断言,它检查单词中是否存在至少3个数字或符号"@"的实例。
  • w{8}匹配任意8个字符(字母、数字和下划线)。
  • b匹配单词边界的末尾。

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

相关内容

  • 没有找到相关文章

最新更新