当前位置: 首页 > 知识库问答 >
问题:

RegEx不超过2个相同的连续字符和a-Z和0-9

何飞翰
2023-03-14

编辑:谢谢你的建议,让我的问题更清楚:)

匹配查找3个连续字符:

Regex Match=AaA653219
Regex Match=AA5556219

代码是ASP。NET 4.0。以下是整个功能:

public ValidationResult ApplyValidationRules()
{
    ValidationResult result = new ValidationResult();
    Regex regEx = new Regex(@"^(?=.*\d)(?=.*[a-zA-Z]).{8,20}$");

    bool valid = regEx.IsMatch(_Password);
    if (!valid)
        result.Errors.Add("Passwords must be 8-20 characters in length, contain at least one alpha character and one numeric character");

    return result;
}

我已经尝试了3个多小时来完成这项工作,参考以下内容却没有成功=/

如何在Java中找到带有正则表达式的重复字符?

.net正则表达式,用于超过2个连续字母

我已经开始使用8-20个字符a-Z0-9

^(?=.*\d)(?=.*[a-zA-Z]).{8,20}$
As Regex regEx = new Regex(@"^(?=.*\d)(?=.*[a-zA-Z]).{8,20}$");

我尝试添加以下变体,但运气不佳:

/(.)\1{9,}/
.*([0-9A-Za-z])\\1+.*
((\\w)\\2+)+". 

任何帮助将不胜感激!

共有2个答案

别子实
2023-03-14

由于匹配条件过于宽泛,因此收紧了匹配条件;例如,“not A-Za-z”匹配的内容比预期的要多得多。之前的REGEX在字符串“ThiIsNot”上进行匹配。在大多数情况下,密码只会包含字母数字和标点符号,因此我限制了范围,这使所有匹配都更加准确。用于人类易读性的字符类。添加和排除列表,并区分大小写字母。

^(?=.{8,20}$)(?!(?:.*[01IiLlOo]))(?=(?:[\[[:digit:]\]\[[:punct:]\]]*[\[[:alpha:]\]]){2})(?=(?:[\[[:digit:]\]\[[:punct:]\]\[[:upper:]\]]*[\[[:lower:]\]]){1})(?=(?:[\[[:digit:]\]\[[:punct:]\]\[[:lower:]\]]*[\[[:upper:]\]]){1})(?=(?:[\[[:alpha:]\]\[[:punct:]\]]*[\[[:digit:]\]]){1})(?=(?:[\[[:alnum:]\]]*[\[[:punct:]\]]){1})(?:([\[[:alnum:]\]\[[:punct:]\]])\1?(?!\1))+$

细分:

^(?=.{8,20}$) - Positive lookahead that the string is between 8 and 20 chars
(?!(?:.*[01IiLlOo])) - Negative lookahead for any blacklisted chars
(?=(?:[\[[:digit:]\]\[[:punct:]\]]*[\[[:alpha:]\]]){2}) - Verify that at least 2 alpha chars exist
(?=(?:[\[[:digit:]\]\[[:punct:]\]\[[:upper:]\]]*[\[[:lower:]\]]){1}) - Verify that at least 1 lowercase alpha exists
(?=(?:[\[[:digit:]\]\[[:punct:]\]\[[:lower:]\]]*[\[[:upper:]\]]){1}) - Verify that at least 1 uppercase alpha exists
(?=(?:[\[[:alpha:]\]\[[:punct:]\]]*[\[[:digit:]\]]){1}) - Verify that at least 1 digit exists
(?=(?:[\[[:alnum:]\]]*[\[[:punct:]\]]){1}) - Verify that at least 1 special/punctuation char exists
(?:([\[[:alnum:]\]\[[:punct:]\]])\1?(?!\1))+$ - Verify that no char is repeated more than twice in a row
艾跃
2023-03-14

http://regexr.com?34vo9

正则表达式:

^(?=.{8,20}$)(([a-z0-9])\2?(?!\2))+$

第一个前瞻((? =.{8,20}$))检查字符串的长度。第二部分通过以下方式进行双字符和有效性检查:

(
  ([a-z0-9])      Matching a character and storing it in a back reference.
  \2?             Optionally match one more EXACT COPY of that character.
  (?!\2)          Make sure the upcoming character is NOT the same character.
)+                Do this ad nauseum.
$                 End of string.

好的。我看到你增加了一些额外的要求。我的基本论坛仍然有效,但是我们必须给你更多的循序渐进的方法。所以:

^...$

由于显而易见的原因,您的整个正则表达式将被放入开始和结束字符中。

(?=.{n,m}$)

长度检查。把它放在正则表达式的开头,n为最小长度,m为最大长度。

(?=(?:[^REQ]*[REQ]){n,m})

必需的字符。将其放在正则表达式的开头,REQ作为您需要的字符,以要求N到M的字符。您可以删除(?:...){n, m}以只需要其中一个字符。

(?:([VALID])\1?(?!\1))+

剩下的表情。将VALID替换为有效字符。因此,您的密码正则表达式是:

^(?=.{8,20}$)(?=[^A-Za-z]*[A-Za-z])(?=[^0-9]*[0-9])(?:([\w\d*?!:;])\1?(?!\1))+$

'炫耀:

^
  (?=.{8,20}$)                 8 to 20 characters
  (?=[^A-Za-z]*[A-Za-z])       At least one Alpha
  (?=[^0-9]*[0-9])             At least one Numeric
  (?:([\w\d*?!:;])\1?(?!\1))+  Valid Characters, not repeated thrice.
$

http://regexr.com?34vol这是正在实施的新方案。

 类似资料:
  • 你好,我对正则表达式是新手,我发现自己在这个问题上卡住了。 我有一个8字符字符串,以前已经过滤为只有一个字母数字,所以这个字符串将只包含数字和字母。我要做的是在字符串中的任何地方找到前两个连续数字,一旦找到,确保两个连续数字之后的任何字符都是alpha字符a-z,如果不匹配,只返回false;到目前为止我 希望这是清楚的 再次感谢您的帮助

  • 问题内容: 通过搜索发现了类似的问题,但我是一位新的(糟糕的)程序员,无法理解答案。 我有一个.txt文件,其中包含多个字符串,以’-‘分隔。我使用拆分将一些字符串分成变量,其中两个相等,但是在if语句中它们不相等。 这将产生以下结果: 瑞典 瑞典 没有 在两个“ Sweden”字符串之前和之后都有一个空格,并且它们都用大写字母“ S”编写,但不相等吗?我在哪里搞砸了? 问题答案: 最后一个元素包

  • 问题内容: 通过阅读的ECMAScript 5.1规范,和被区分。 那为什么要评估? 问题答案: JavaScript使用IEEE754标准表示数字。: 有符号的零 为零,具有相关的符号。在普通算术中,-0 = +0 =0。但是,在计算中,某些数字表示形式允许存在两个零,通常用 -0(负零) 和 +0(正零)表示 。这在某些带符号的整数表示形式以及大多数浮点数表示形式中都会发生。数字0通常被编码为

  • 问题内容: 我有2张桌子。为了简化: 表1,用户: userId int,userName nvarchar(50) 表2消息: msgId int,msgFrom int,msgTo int … msg1和msg2都包含userId。现在,我想获取所有消息,但是我想要用户名而不是msgFrom。我知道该怎么办: 一切正常,花花公子。获取用户名而不是msgTo的方法相同。现在的问题是,如何在同一调

  • 我一直在尝试从一个有一万亿个字符的字符串中访问一个字符。我使用BigInteger从字符串中获取索引号,并使用charAt方法从字符串中访问字符。 我试图做的是计算给定字符串中特定字符的出现次数。 例如,字符串:

  • 从韩国网站下载文件时,文件名经常被错误编码/解码,最终变得混乱不堪。我发现通过用iso-8859-1编码并用euc-kr解码,我可以解决这个问题。然而,我有一个新问题,看起来一样的角色实际上是不同的。看看Python shell的下面: 可以使用“iso-8859-1”对第一个字符串进行编码。后者并非如此。因此,问题是: 这两个字符串之间有什么区别 为什么从同一个网站下载的内容会有不同格式的相同字