一尘不染

正则表达式:我想要这个AND那个AND那个……以任何顺序

c#

我什至不确定这是否可行,但这就是我想要的。

String: "NS306 FEBRUARY 20078/9/201013B1-9-1Low31 AUGUST 19870"

我有一个文本框,在其中输入搜索参数,它们之间用空格分隔。因此,我想返回一个匹配项,即string1在字符串中,然后string2在字符串中,或​​string2在字符串中,然后string1在字符串中。我不在乎字符串的顺序,但是必须将所有字符串(超过2个)都放在字符串中。

因此,例如,在提供的字符串中,我想要:

"FEB Low"

要么

"Low FEB"

…作为比赛返回。

我对regex真的很陌生,只在这里阅读了一些教程,但这是前一阵子,我需要今天完成。周一,我开始了一个新项目,这个项目要重要得多,不能因为这个问题而分心。无论如何,使用正则表达式可以做到这一点,还是我必须遍历搜索过滤器的每个部分并排列顺序?任何帮助都将受到高度赞赏。谢谢。

更新:我不想遍历一个循环并寻找最佳性能的原因是因为不幸的是,我正在使用的dataTable在每次按键时都调用此函数,并且我不希望它陷入困境。

更新:谢谢大家的帮助,非常感谢。

代码更新:

最终,这就是我所追求的。

string sSearch = nvc["sSearch"].ToString().Replace(" ", ")(?=.*");
if (sSearch != null && sSearch != "")
{
  Regex r = new Regex("^(?=.*" + sSearch + ").*$", RegexOptions.IgnoreCase);
  _AdminList = _AdminList.Where<IPB>(
                                       delegate(IPB ipb)
                                       {
                                          //Concatenated all elements of IPB into a string
                                          bool returnValue = r.IsMatch(strTest); //strTest is the concatenated string
                                          return returnValue;
                                    }).ToList<IPB>();
                                       }
}

IPB类具有X个元素,在我正在处理的整个站点中没有一个表中的列是相同顺序的。因此,我需要进行任何订单搜索,而且我不想编写很多代码来执行此操作。这里还有其他一些好主意,但是我知道我的老板真的很喜欢Regex(鼓吹他们),因此我认为最好是现在就去做。如果由于某种原因该站点的性能下降(内联网站点),那么我将尝试另一种方法。谢谢大家。


阅读 701

收藏
2020-05-19

共1个答案

一尘不染

您可以使用(?=…) 正向前瞻
;它断言给定的模式可以匹配。您将锚定在字符串的开头,然后以任意顺序一个接一个地查找每个模式的匹配项。

它看起来像这样:

^(?=.*one)(?=.*two)(?=.*three).*$

这将匹配包含字符串"one""two""three",以任意顺序(如参见rubular.com)。

根据上下文,您可能需要在和上定位,并使用单行模式,以便匹配所有内容。\A``\Z

这不是解决问题的最有效方法。最好的解决方案是解析输入中的单词并将其放入有效的集合表示中,等等。

相关问题


更实际的示例:密码验证

假设我们希望我们的密码:

  • 包含8到15个字符
  • 必须含有大写字母
  • 必须包含小写字母
  • 必须包含一个数字
  • 必须包含特殊符号之一

然后,我们可以编写这样的正则表达式:

^(?=.{8,15}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*]).*$
 \__________/\_________/\_________/\_________/\______________/
    length      upper      lower      digit        symbol
2020-05-19