C# .NET正则表达式在代码上不匹配,在每个测试工具中都有效

C# .NET正则表达式在代码上不匹配,在每个测试工具中都有效,c#,.net,regex,C#,.net,Regex,这件对我来说真是一件让人头疼的事 var matches = Regex.Matches("<p>test something<script language=\"javascript\">alert('hello');</script> and here's <b>bold</b> and <i>italic</i> and <a href=\"http://popw.com/\">link<

这件对我来说真是一件让人头疼的事

var matches = Regex.Matches("<p>test something<script language=\"javascript\">alert('hello');</script> and here's <b>bold</b> and <i>italic</i> and <a href=\"http://popw.com/\">link</a>.</p>", "</?(?!p|a|b|i)\b[^>]*>");
var matches=Regex.matches(testsomethingalert('hello');这里是粗体和斜体以及。

,“]*>”;
正则表达式应该捕获任何不是p、a、b或i的HTML标记(打开或关闭)。我已经将输入字符串和正则表达式插入到无数的测试页面中,每一个页面都返回匹配的脚本标记(打开和关闭)。但它在代码中绝对不起作用。matches变量的计数为0


我是否遗漏了一些非常明显的内容?

您忘记在模式字符串中转义反斜杠

"</?(?!p|a|b|i)\\b[^>]*>"
“]*>”
(?!)
是一种消极的前瞻。如果包含的模式与当前位置不匹配,则匹配零个字符

(?!p | a | b | i)\\b
将查看下一个字符是否匹配
p | a | b | i
。如果是这样的话,前瞻性就无法匹配任何东西。如果包含的模式无法匹配,则前瞻成功,并尝试从同一位置匹配模式中的下一个标记。在本例中,是一个单词边界

你想要的可能是这样的:

@"</?(?!(?:p|a|b|i)\b)\w+[^>]*>"
@“]*>”

它期待着与
(?:p|a | b | i)\b
匹配的东西。如果该模式未能匹配,则前瞻将成功,并且它将匹配至少一个单词字符,后跟任意数量的字符,直到结束
“>”

或者,我应该使用C字符串文字指示符。嗯@“]*>“不,老实说,我所拥有的正是我想要的,而且它通过了我所有的单元测试。我只是犯了一个愚蠢的错误,没有将它用作字符串文字(或者像Guffa建议的那样转义\)。