先进的正则表达式

先进的正则表达式

问题描述:

由于没有关于如何做到这一点的教程和每个问题都有其独特的解决方案,所以我无法理解这将如何实现它的工作。我试图做的是删除不符合要求的行。每一行都有一个单词。使用richTextBox。先进的正则表达式

我对每一行的要求是:

  • 分钟3号
  • 最多25个字母
  • ATLEAST 1号
  • ,包括至少一个字母

如果任何这些要求在一行中无效,该行被删除。 我是打(没有成功),代码为:

richTextBox1.Text = Regex.Replace(richTextBox1.Text, "(a-z).*?(0-9)", ""); 
+2

“最少3个数字”和“至少1个数字” - 那么确切的最小数量是多少?一个三? –

+1

“既然theres没有指导如何做到这一点,每个问题都有其独特的解决方案”Whaaat?你的意思是没有[在线资源](https://regexone.com/)正则表达式?没有任何教程能够给你提供确切的解决方案,甚至没有关闭每一个地方都有大量的pwd正则表达式验证!甚至有工具可以为你编写。 –

+1

[Regex for password必须包含至少8个字符,至少包含一个数字以及大小写字母和特殊字符](https://*.com/questions/19605150/regex-for-password-must - 至少包含八个字符 - 至少一个数字) –

我认为你不需要为这个任务正则表达式。只是检查与简单的LINQ查询您的RichTextBox的每一行是这样的:

// rtb is a RichTextBox; 
var sb = new StringBuilder(); 
foreach (var line in rtb.Lines) 
{ 
    var numbers = line.Count(char.IsDigit); 
    var letters = line.Count(char.IsLetter); 

    if (numbers < 1 || numbers > 3 || letters < 1 || letters > 25) 
     continue; 

    sb.AppendLine(line); 
} 
rtb.Text = sb.ToString(); 

可以使用量词[A-Z] {3,25},例如。

https://docs.microsoft.com/en-us/dotnet/standard/base-types/quantifiers-in-regular-expressions

我现在认识到3指的是数字,但你的想法。

+0

究竟是如何得到一个反对票? –

+0

可能是因为他现在拼错了,语法 - 纳粹主持人:D – Wuzbee

+0

:-)我现在改变了它 - 这似乎不值得,但如果它可能会让人不安。 –

如上所述,“最少3位数”和“至少1位数”是冲突的要求。我假设你的意思是最多3个数字。 如果是这样(但您可以适应其他要求),让我们一步一步构建您的正则表达式。

  1. 快报:你可以匹配一个喜欢的东西[a-zA-z]或更好[\p{L}]如果你想利用非平凡的字母考虑进去,例如重音字母
  2. 编号:与[\d]相匹配
  3. 重复实例:如果您想要在一个字符的m个和n个实例之间,例如一个号码,写[\d]{m, n}
  4. 线:一条线是由^$对之间,它可以包括标点符号,空格等
  5. 计数实例:如果你只是想计算的情况下,使用向前看符号;如果你想确保你得到了一定的匹配(如1和3之间的线路,这意味着^[\d]{1,3}$在正则表达式方面的数字),内(?=)
  6. 零括IT运更多的字符:使用*,如“零或更多数字“变成[\d]*
  7. 与给定字符不同:如果您寻找不同的字符,例如从一些,才使用插入符号(^),如[^\d]
  8. 任何字符:与.
  9. “至少”选择:也就是说,你也可以从这些不同的其他字符,你之前搜索,可能是两个之后。如果您查找可能有或可能未包含一个或多个非数字的号码,请写[^\d]*[\d];如果你找了一些可能会或可能不会被前面和/或后面跟着一个或多个非数字,写[^\d]*[\d][^\d]*

所以,你的要求是包含

    之间
  • 每一行匹配1首3个数字(不管是什么之前或之后他们每个人):1个25个字母之间 (?=(^([^\d]*[\d][^\d]*){1,3}$))
  • (不管是什么之前或之后他们中的每一个): (?=(^([^\p{L}]*[\p{L}][^\p{L}]*){1,25}$))

由于您刚刚使用上述两个正则表达式检查了数字和字母计数,但实际上并未选择任何内容,您仍然必须实际匹配任何内容。 要匹配任何长度的行,请写\b.*\b

将所有内容放在一起,你会得到

(?=(^([^\d]*[\d][^\d]*){1,3}$))(?=(^([^\p{L}]*[\p{L}][^\p{L}]*){1,25}$))^.*$ 

相关链接:thisthis one。测试here