簡體   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