[英]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.