我什至不确定这是否可行,但这就是我想要的。
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(鼓吹他们),因此我认为最好是现在就去做。如果由于某种原因该站点的性能下降(内联网站点),那么我将尝试另一种方法。谢谢大家。
您可以使用(?=…) 正向前瞻 ;它断言给定的模式可以匹配。您将锚定在字符串的开头,然后以任意顺序一个接一个地查找每个模式的匹配项。
(?=…)
它看起来像这样:
^(?=.*one)(?=.*two)(?=.*three).*$
这将匹配包含字符串"one","two","three",以任意顺序(如参见rubular.com)。
"one"
"two"
"three"
根据上下文,您可能需要在和上定位,并使用单行模式,以便点匹配所有内容。\A``\Z
\A``\Z
这不是解决问题的最有效方法。最好的解决方案是解析输入中的单词并将其放入有效的集合表示中,等等。
(?<=#)[^#]+(?=#)
假设我们希望我们的密码:
然后,我们可以编写这样的正则表达式:
^(?=.{8,15}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*]).*$ \__________/\_________/\_________/\_________/\______________/ length upper lower digit symbol