首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式模式混淆了c#

正则表达式模式混淆了c#
EN

Stack Overflow用户
提问于 2021-12-19 10:19:28
回答 1查看 69关注 0票数 0

我试图编写一个基本函数,该函数接受输入文本,为该输入创建regex,并将所有输出作为集合返回。

我写了这个:

代码语言:javascript
运行
复制
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输出:医疗保健

我的看台有什么问题?

解决办法是

代码语言:javascript
运行
复制
(\bh\w*al\w*re)

感谢@anubhava

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-19 11:29:18

,我的正则表达式有什么问题?

Regex不像DOS文件名通配符

在DOS中,h*al*re将真正与“保健”相匹配,因为*在DOS中的意思是“任何字符的零或更多”

在Regex中,意思微妙地不同;它的意思是“星号左边的零或更多的东西”。

  • h* -表示row
  • l*中的零或多个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只匹配“医疗保健”,但也匹配“兔子”。

为此,您可能需要考虑完全不使用*,而是使用更具体的方法,例如:

代码语言:javascript
运行
复制
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等扔掉吧。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70410538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档