我正在尝试创建一个匹配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匹配单词边界的末尾。
注意,这个正则表达式假定字符串中没有空格或其他非单词字符。如果有,你可能需要修改正则表达式来处理它们。