今天我可以做硬代码,但后来我想改变它,字符串单词模式可以应用于@" \ 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;
}
答案 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);