在动态方法中使用正则表达式

时间:2016-02-29 14:32:44

标签: c# regex

今天我可以做硬代码,但后来我想改变它,字符串单词模式可以应用于@" \ bfood \ b"的一侧。我想在不使用硬编码的情况下将其变为动态

在未来,我希望得到“#34; chicken"而不是"食物"。

我尝试将代码"@"\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 个答案:

答案 0 :(得分: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($@"(?<!\w){Regex.Escape(pattern)}(?!\w)", RegexOptions.None);

现在,为什么我建议使用(?<!\w)(?!\w)外观?因为这些是与上下文无关的字边界。如果您决定通过|border|模式怎么办? \b\|border\|\b很可能无法匹配您要匹配的大部分案例,因为\b需要在第一个|之前和之后|之前显示一个字符。 。只有在没有用单词字符括起来时,lookarounds才会匹配|border|字符串。

答案 1 :(得分:1)

| id | loc | dad | 1 | Park X | City A, City B 无法正常工作的原因是,逐字字符串文字@"\b" + pattern +"\b"未应用于您正则表达式构建的两个部分。

修复此问题
@

甚至更好地使用@"\b" + pattern + @"\b"

String.Format()

或使用C#6字符串插值

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