正则表达式仅适用于不以空格分隔的单个单词

Regex works only with a single words not separated by whitespaces

我有这个正则表达式,它在一个最小长度为 4 的单词中查找一个数字和一个字符:

^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}$ 

适用于:

ABCD1

但如果我有多个词,例如:

ABCD1 ABCD2

它停止工作,因为空格破坏了正则表达式:/

我如何改进我的正则表达式以允许捕获所有由空格分隔的单词?

演示:https://regex101.com/r/S3APfJ/1

您可以在输入中使用 match() 来查找所有匹配项:

var input = "1234 ABCD1 ABCD2 ABCDE";
var matches = input.match(/\b(?=\S*\d)(?=\S*[a-zA-Z])[a-zA-Z0-9]{4,}\b/g);
console.log(matches);

您可以使用

text.split(/\s+/).filter(x => /YOUR_VALIDATION_REGEX/.test(x))

注意:

  • .split(/\s+/) - 用空格分割字符串
  • .filter(x => /^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}$/.test(x) - 如果项目与您的初始正则表达式匹配,则获取该项目。

查看 JavaScript 演示:

const text = "this is a phrase with ABC1 and ABCD2 but no ABC1!";
const rx = /^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}$/;
console.log(text.split(/\s+/).filter(x => rx.test(x)));

如果您使用

/^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}$/ 性能可以提高
/^(?=\D*\d)(?=[^a-zA-Z]*[a-zA-Z])[a-zA-Z0-9]{4,}$/