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