繁体   English   中英

正则表达式模式混淆 c#

[英]regex pattern confuse c#

我正在尝试编写一个基本的 function ,它接受输入文本,为此输入创建正则表达式并将所有 output 作为集合返回。
我写了这个:

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);
}

我的文字->“asdad Healthcare basdasd”
但是如果我给定了模式 h al re 我的正则表达式模式看起来像这样 --> (\wh al re)
和 output 是 --> “是”

预期行为

Input: h*al*re Output: healthcare

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

解决方案是

(\bh\w*al\w*re)

感谢@anubhava

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

正则表达式不像 DOS 文件名通配符

在 DOS 中, h*al*re真的会匹配“healthcare”,因为*在 DOS 中表示“任何字符的零个或多个”

在正则表达式中,含义略有不同; 它的意思是“星号左边的零个或多个”

  • h* - 表示一行中的零个或多个 h 字符
  • l* - 表示一行中的零个或多个 l 个字符

这意味着h*al*re将匹配诸如“hhhhhhhhhallllllllre”或“hhalllllllllllllllllllllllllllllllre”或(如您所见)“are”,它是零“h”,然后是“a”,然后是零“l”,然后是“re " - 它完全符合要求零个或多个 "h" 的模式

您需要做的是将*与另一个 Regex 构造(例如. 这意味着“任何单个字符”。

当你放.*时,它的意思是“匹配零个或多个:任何单个字符”

因此,匹配“healthcare”的正则表达式是h.*al.*re

请注意,它也将匹配 heealthcare、hzzzzzzalzzzzzzre 等。


接下来你要应对的是贪婪与悲观匹配的概念

.*是贪婪的; 它试图尽可能地匹配。 这意味着它会消耗整个输入,然后一次将其吐出一个字符以尝试使匹配成功

如果您有一句话“医疗保健中最大的问题是医疗保健提供者无处不在”并且您在其上运行您的正则表达式,那么您的h h.*a.*re最终匹配“医疗保健中最大的问题是医疗保健提供者是无处不 _

粗体位是正则表达式中的固定字符(“h”、“a”和“re”),斜体位是.*匹配的内容 - 这是您尝试匹配时得到的内容尽可能

您可能想要悲观匹配,其中匹配项尝试尽可能少地匹配而不是尽可能多地匹配,为此您需要另一个修饰符来更改 * 的行为,这是通过放置 a? 之后 *

.*? 将修改 * 以便它不会消耗整个输入然后向后工作,而是向前工作以寻找匹配项,因此h.*?a.*?re仅匹配“healthcare”,但它也匹配“hare”..

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

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

但主要带走; 如果您正在学习正则表达式,请放弃您对 DOS 等通配符的了解

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM