Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非常简单的正则表达式不起作用_C#_.net_Regex_String - Fatal编程技术网

C# 非常简单的正则表达式不起作用

C# 非常简单的正则表达式不起作用,c#,.net,regex,string,C#,.net,Regex,String,为了使用正则表达式(在.NET中)匹配字符串中的单词,我可以在正则表达式中使用单词边界说明符(\b)。但是,这些调用都不会导致任何匹配 Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\b@p1\b"); Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b"); 我做错什么了吗 编辑:第二个已在工作;) 更新:如前所述,@不是单

为了使用正则表达式(在.NET中)匹配字符串中的单词,我可以在正则表达式中使用单词边界说明符(
\b
)。但是,这些调用都不会导致任何匹配

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\b@p1\b");

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b");
我做错什么了吗


编辑:第二个已在工作;)

更新:如前所述,
@
不是单词字符,因此
@
和空格之间没有单词边界。作为一种解决方法,您可以改为使用:

否则,字符串“\b”将被解释为退格(字符8),而不是正则表达式字边界。MSDN上有关于文字的更多信息

不使用带@引号的字符串文字的另一种方法是转义反斜杠:

"\\b@p1\\b"

\
正在字符串中转义-您需要使用以避免此情况:

@"\bINSERT\b"

否则,正则表达式会看到
“bINSERTb”

第二种情况由另一个答案中所述的
@“\bINSERT\b”
解决

但是
/b
在以下位置匹配:

  • 在 字符串,如果第一个字符是 单词字符
  • 在最后一个字符之后 字符串,如果最后一个字符是 单词字符
  • 在字符串中的两个字符之间, 其中一个是单词字符,另一个是 另一个不是单词字符
单词字符是
[A-zA-Z0-9.
中的一种,因此第一种情况不能通过在
@
前面加前缀以转义
\b
字符来解决,因为您试图匹配非单词字符(
@


更新:
第一种情况可以通过一个否定的look-behind断言来解决,但也可以通过使用一个否定的单词边界
\B
来解决,这将导致更清晰的语法(
@)\B@p1\b“

哦,谢谢你指出这一点;)有什么办法克服它吗?@Thomas Wanner,您可以使用正则表达式查找零宽度断言。勾选Mark Byers答案以获得解决方案。应该在上面的“然而…”处写\b而不是/b。刚刚出现了这个问题,在我的各种外部正则表达式测试程序中,一切都正常工作;只是不在我的代码中-我忘了@。
"\\b@p1\\b"
@"\bINSERT\b"