正则表达式:我希望这个和那个......以任何顺序......

Xst*_*ity 43 c# regex

我甚至不确定这是否可能,但这就是我想要的.

String: "NS306 FEBRUARY 20078/9/201013B1-9-1Low31 AUGUST 19870"
Run Code Online (Sandbox Code Playgroud)

我有一个文本框,我在其中键入搜索参数,它们是空格分隔的.因此,我想返回一个匹配字符串是string1在字符串中,然后string2在字符串中,或​​者string2在字符串中,然后string1在字符串中.我不在乎字符串的顺序是什么,但是它们(我将会超过2个)必须在字符串中.

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

"FEB Low"
Run Code Online (Sandbox Code Playgroud)

要么

"Low FEB"
Run Code Online (Sandbox Code Playgroud)

......作为比赛返回

我真的是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>();
                                       }
}
Run Code Online (Sandbox Code Playgroud)

IPB类有X个元素,在我所工作的整个站点中没有一个表是相同顺序的列.因此,我需要任何订单搜索,我不想写很多代码来做它.这里还有其他好的想法,但我知道我的老板真的很喜欢Regex(讲道他们),因此我认为如果我现在就这样做是最好的.如果由于某种原因网站的性能下滑(内部网站点),那么我会尝试另一种方式.感谢大家.

pol*_*nts 100

你可以使用(?=…) 积极的前瞻 ; 它断言给定的模式可以匹配.您将锚定在字符串的开头,并以任何顺序逐个查找每个模式的匹配项.

它看起来像这样:

^(?=.*one)(?=.*two)(?=.*three).*$
Run Code Online (Sandbox Code Playgroud)

这将匹配包含字符串"one","two","three",在(任意顺序为上看到rubular.com).

根据上下文,你可能要锚定\A\Z,并使用单线模式,相匹配的一切.

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

相关问题


更实际的例子:密码验证

假设我们想要密码:

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

然后我们可以像这样写一个正则表达式:

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

  • 值得一提的是,* 允许 ?=。匹配任意数量的字符后。我花了一些搜索和测试才弄清楚这一点,但没有明确提及。 (2认同)