我试图编写一个基本函数,该函数接受输入文本,为该输入创建regex,并将所有输出作为集合返回。
我写了这个:
string pattern = @"(\wh*al*re)"; // take this pattern from outside
Regex rg = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matchedAuthors = rg.Matches(authors);
for (int count = 0; count < matchedAuthors.Count; count++)
{
Console.WriteLine(count);
Console.WriteLine(matchedAuthors[count].Value);
}我的文字-->“作为医疗保健的基础”
但是如果我被赋予模式h_al_re,我的regex模式看起来是这样-> (\wh_al_re)
输出是-> "are“
预期行为
输入: h*al*re输出:医疗保健
我的看台有什么问题?
解决办法是
(\bh\w*al\w*re)感谢@anubhava
发布于 2021-12-19 11:29:18
,我的正则表达式有什么问题?
Regex不像DOS文件名通配符
在DOS中,h*al*re将真正与“保健”相匹配,因为*在DOS中的意思是“任何字符的零或更多”
在Regex中,意思微妙地不同;它的意思是“星号左边的零或更多的东西”。
h* -表示rowl*中的零或多个h字符,表示行中的零或多个l字符。
这意味着h*al*re将匹配类似于"hhhhhhhhhallllllllre“或"hhalllllllllllllllllllllllllllllllre”或"are“(如您所发现的)的”are“,即"h",然后"a",然后"l",然后"re”--它完全符合一个要求零或多个"h“的模式。
您需要做的是将*与另一个Regex构造(如. )结合,这意味着“任何单个字符”。
当您放置.*时,它的意思是“匹配零或多个:任何单个字符”。
因此,匹配“医疗保健”的Regex是h.*al.*re。
请注意,它还将匹配heealthcare,hzzzzzzalzzzzzzre等。
接下来你必须面对的是贪婪和悲观匹配的概念。
.*是贪婪的,它试图尽可能地匹配。这意味着它消耗了整个输入,然后每次吐出一个字符,试图使匹配成功。
如果你有句“医疗保健中最大的问题是医疗服务提供者到处都是超负荷”,并且你在上面运行了Regex,那么你的h.*a.*re最终就匹配了“healthcare中最大的问题是,医疗服务提供商在re的每一个时候都是一个。”
粗体位是正则表达式中的固定字符( "h“、"a”和"re"),斜体位是.*所匹配的--这是尽可能匹配时得到的。
您可能需要悲观匹配,在这种匹配中,匹配尽量少,而不是尽可能多,为此,需要另一个修饰符来更改*的行为,这是通过放置一个?在*之后
.*?将修改*,这样,与其使用整个输入,然后向后工作,它还可以向前查找匹配项,因此h.*?a.*?re只匹配“医疗保健”,但也匹配“兔子”。
为此,您可能需要考虑完全不使用*,而是使用更具体的方法,例如:
h.+?al.+?re //+ means "one or more of the thing to the left"
h.{2}al.{4}re //{n} means exactly n of the thing to the left但是,如果你开始学习Regex的话,就把你所知道的通配符从DOS等扔掉吧。
https://stackoverflow.com/questions/70410538
复制相似问题