2016-02-29 30 views
1

今天我可以做硬代碼,但後來我想改變它,字符串字模式可以應用在@「\ bfood \ b」的一側。我想在不使用硬編碼的情況下將其變爲動態在動態方法中使用正則表達式

在futore中,我希望有「雞」而不是「食物」這個詞。

我試圖將代碼"@"\bfood\b"替換爲@"\b" + pattern +"\b",但它不起作用。

string inputText = "food ddd dd"; 

    string dddd = "\bfood\b"; 

    string pattern = "food"; 
    Regex rx = new Regex(@"\bfood\b", RegexOptions.None); 
    MatchCollection mc = rx.Matches(inputText); 

    if (rx.Match(pattern).Success) 
    { 
     int dd = 3; 
    } 

回答

2

您應該使用

@"\b" + Regex.Escape(pattern) + @"\b" 

或者更通用的:

@"(?<!\w)" + Regex.Escape(pattern) + @"(?!\w)" 

或者與string.format

Regex rx = new Regex(string.Format(@"\b{0}\b", Regex.Escape(pattern)), RegexOptions.None); 

或者以字符串插值:

Regex rx = new Regex([email protected]"(?<!\w){Regex.Escape(pattern)}(?!\w)", RegexOptions.None); 

現在,爲什麼我建議(?<!\w)(?!\w)的變臉?因爲這些是與上下文無關的單詞邊界。如果您決定通過|border|模式怎麼辦? \b\|border\|\b很可能無法匹配您想要匹配的大多數情況,因爲\b將需要在第一個|之前和最後一個|之前出現單詞字符。只有在未包含單詞字符的情況下,查找表纔會匹配|border|字符串。

+0

我不會用'string.Format'在這裏,沒有'Regex.Escape'。也許'string.Format(@「\ b {0} \ b」,Regex.Escape(pattern))',除非應用程序允許用戶實際輸入正則表達式來搜索,這種情況很少見。 –

+0

@AndersTornbladL我同意。我將我的推理與示例正則表達式聲明一起添加。 –

1

的原因,你的@"\b" + pattern +"\b"沒有工作是,逐字字符串@並不適用於兩個件您正則表達式建設。

修復此與任何

@"\b" + pattern + @"\b" 

甚至更​​好使用String.Format()

String.Format(@"\b{0}\b", pattern); 

或者使用C#6串插

[email protected]"\b{pattern}\b";