正则表达式检测具有 2+ 个数字和 2+ 个字符的单词
regex detect word with 2+ number and 2+ character
我需要一个正则表达式来检测长度为 8 个字符且包含 2 个以上数字和 2 个以上字符(无特殊字符)的单词。
我接近解决方案了,我在 regex101.com 上做了正则表达式。
问题是包含一个与我的正则表达式不相关的数字的单词。
我丢弃了所有字符包含至少 7 个字符且 (?![A-Za-z]{7,})
的所有单词。
我丢弃了所有包含 (?![\d]{7,})
的最少 7 个数字的单词。
并且我丢弃了包含最少 2 个数字和 2 个字符的单词 (?=[a-zA-Z\d]{2})[A-Za-z\d]{8}
。
为什么匹配vaff8loe
?
我创建这个正则表达式是因为在我必须用 ******* 替换整个单词之后。
喜欢:
papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y
替换后("regex","********")
********ciao il mio pin papaver1 è reeredji332ji con ******** 1234567o ******** papavero 9o ********
您可以使用积极的前瞻模式来限制数字和字母的数量:
\b(?=(?:\w*\d){2}\w*)(?=(?:\w*[A-Za-z]){2}\w*)\w{8}\b
使用 2 zero-width 个正前瞻:
(?=.*?[a-zA-Z].*?[a-zA-Z]) Must contain 2 ASCII letters
(?=.*?[0-9].*?[0-9]) Must contain 2 digits
[a-zA-Z0-9]{8} Must be exactly 8 letters and/or digits
如果不使用 matches()
作为 运行 正则表达式,请添加 ^
和 $
。
这意味着完整的正则表达式:
^(?=.*?[a-zA-Z].*?[a-zA-Z])(?=.*?[0-9].*?[0-9])[a-zA-Z0-9]{8}$
为获得最佳性能,请将 .
模式替换为负字符 class。在这种情况下,您可能希望使用重复的 non-capturing 组来缩短它:
(?=(?:[^a-zA-Z]*[a-zA-Z]){2})
(?=(?:[^0-9]*[0-9]){2})
更新
由于问题已更新为需要正则表达式来用 * 替换此类单词,因此 ^
和 $
锚点应更改为 \b
单词边界模式,负字符 classes 必须更改为仅跳过有效字符:
s = s.replaceAll("\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\b", "********");
有关演示,请参阅 regex101。
请注意,给定示例中的 vaff8loe
仅包含 1 个数字,因此不应替换。
在你需要应用这么多条件来解析的情况下(单词必须有长度== 8,2+字母字符,2+数字字符并且没有特殊字符),我认为你应该努力解决你可以 读取 而不是将所有内容都放在一个复杂的正则表达式中。
假设您使用 解决方案,您的代码将如下所示:
let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";
s = s.replace(/\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\b/g, "********");
console.log(s);
目前还不清楚您在这里做什么,最终的错误 and/or 对您逻辑的更改将难以维护。相反,您可以利用 function replacement parameter 来打破您的规则。然后你会有这样的东西:
let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";
// The first regex filters only 8-length words
s = s.replace(/\b\w{8}\b/g,
function(fullMatch) {
// .match() can return null if no match is found,
// so I'm accounting for this.
const digitMatch = fullMatch.match(/\d/g) || [];
const letterMatch = fullMatch.match(/[a-zA-Z]/g) || [];
const specialCharMatch = fullMatch.match(/\[^a-zA-Z0-9]/g);
if (digitMatch.length >= 2
&& letterMatch.length >= 2
&& specialCharMatch === null) {
return "********";
} else {
return fullMatch;
}
});
console.log(s);
它更冗长,但也更具可读性和可调试性。
希望对您有所帮助!
我需要一个正则表达式来检测长度为 8 个字符且包含 2 个以上数字和 2 个以上字符(无特殊字符)的单词。
我接近解决方案了,我在 regex101.com 上做了正则表达式。
问题是包含一个与我的正则表达式不相关的数字的单词。
我丢弃了所有字符包含至少 7 个字符且 (?![A-Za-z]{7,})
的所有单词。
我丢弃了所有包含 (?![\d]{7,})
的最少 7 个数字的单词。
并且我丢弃了包含最少 2 个数字和 2 个字符的单词 (?=[a-zA-Z\d]{2})[A-Za-z\d]{8}
。
为什么匹配vaff8loe
?
我创建这个正则表达式是因为在我必须用 ******* 替换整个单词之后。 喜欢:
papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y
替换后("regex","********")
********ciao il mio pin papaver1 è reeredji332ji con ******** 1234567o ******** papavero 9o ********
您可以使用积极的前瞻模式来限制数字和字母的数量:
\b(?=(?:\w*\d){2}\w*)(?=(?:\w*[A-Za-z]){2}\w*)\w{8}\b
使用 2 zero-width 个正前瞻:
(?=.*?[a-zA-Z].*?[a-zA-Z]) Must contain 2 ASCII letters
(?=.*?[0-9].*?[0-9]) Must contain 2 digits
[a-zA-Z0-9]{8} Must be exactly 8 letters and/or digits
如果不使用 matches()
作为 运行 正则表达式,请添加 ^
和 $
。
这意味着完整的正则表达式:
^(?=.*?[a-zA-Z].*?[a-zA-Z])(?=.*?[0-9].*?[0-9])[a-zA-Z0-9]{8}$
为获得最佳性能,请将 .
模式替换为负字符 class。在这种情况下,您可能希望使用重复的 non-capturing 组来缩短它:
(?=(?:[^a-zA-Z]*[a-zA-Z]){2})
(?=(?:[^0-9]*[0-9]){2})
更新
由于问题已更新为需要正则表达式来用 * 替换此类单词,因此 ^
和 $
锚点应更改为 \b
单词边界模式,负字符 classes 必须更改为仅跳过有效字符:
s = s.replaceAll("\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\b", "********");
有关演示,请参阅 regex101。
请注意,给定示例中的 vaff8loe
仅包含 1 个数字,因此不应替换。
在你需要应用这么多条件来解析的情况下(单词必须有长度== 8,2+字母字符,2+数字字符并且没有特殊字符),我认为你应该努力解决你可以 读取 而不是将所有内容都放在一个复杂的正则表达式中。
假设您使用
let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";
s = s.replace(/\b(?=(?:[0-9]*[a-zA-Z]){2})(?=(?:[a-zA-Z]*[0-9]){2})[a-zA-Z0-9]{8}\b/g, "********");
console.log(s);
目前还不清楚您在这里做什么,最终的错误 and/or 对您逻辑的更改将难以维护。相反,您可以利用 function replacement parameter 来打破您的规则。然后你会有这样的东西:
let s = "papave23 ciao il mio pin papaver1 è reeredji332ji con vaff8loe 1234567o 123t123t papavero 9o 123t123y";
// The first regex filters only 8-length words
s = s.replace(/\b\w{8}\b/g,
function(fullMatch) {
// .match() can return null if no match is found,
// so I'm accounting for this.
const digitMatch = fullMatch.match(/\d/g) || [];
const letterMatch = fullMatch.match(/[a-zA-Z]/g) || [];
const specialCharMatch = fullMatch.match(/\[^a-zA-Z0-9]/g);
if (digitMatch.length >= 2
&& letterMatch.length >= 2
&& specialCharMatch === null) {
return "********";
} else {
return fullMatch;
}
});
console.log(s);
它更冗长,但也更具可读性和可调试性。
希望对您有所帮助!