正则表达式检测具有2个以上数字和2个以上字符的单词

时间:2019-05-16 17:15:41

标签: javascript java regex replace regex-group

我需要一个正则表达式来检测长度为8个字符的单词,这些单词包含2个以上的数字和2个以上的字符(无特殊字符)。

我已经解决了,我在regex101.com上进行了正则表达式。

问题是包含一个数字的单词不应该对我的正则表达式有所帮助。

我用(?![A-Za-z]{7,})丢弃了所有字符中至少包含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

使用replace(“ regex”,“ ********”)

之后
********ciao il mio pin papaver1 è reeredji332ji con ******** 1234567o ******** papavero 9o ********

3 个答案:

答案 0 :(得分:3)

使用2个零宽度的正向超前行:

(?=.*?[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}$

为获得最佳性能,请用负字符类替换.模式。在这种情况下,您可能需要使用重复的非捕获组来缩短它:

(?=(?:[^a-zA-Z]*[a-zA-Z]){2})
(?=(?:[^0-9]*[0-9]){2})

更新

更新了一个问题,说需要用正则表达式将*替换为这些单词,^$锚点应更改为\b单词边界模式,并且否定字符类必须更改为仅跳过有效字符:

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位数字,因此不应替换。

答案 1 :(得分:2)

您可以使用正向超前模式来限制数字和字母的数量:

\b(?=(?:\w*\d){2}\w*)(?=(?:\w*[A-Za-z]){2}\w*)\w{8}\b

演示:https://regex101.com/r/z33bUv/7

答案 2 :(得分:2)

在您需要对解析应用许多条件的情况下(单词必须具有== 8的长度,单词必须具有2个以上的字母字符,2个以上的数字字符且没有特殊字符),我认为您应该努力寻找可以解决的方法< em> read ,而不是将所有内容都放在单个复杂的正则表达式中。

假设您使用@Andreas解决方案,那么您的代码将如下所示:

<ContentPresenter 
    Width="100"
    Content="{Binding ID}"
    TextBlock.FontFamily="{Binding TextFont, PresentationTraceSources.TraceLevel=High}"
    TextBlock.Foreground="{Binding BindedTextColor}"
    />

目前尚不清楚您在这里做什么,并且最终的错误和/或逻辑更改将难以维护。相反,您可以利用function replacement parameter来打破规则。然后,您将得到以下内容:

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);

它更冗长,但也更具可读性和调试性。

希望有帮助!