如何使此C#Regex在匹配结果中不包含URL之前的第一个字符:
((?!\").)https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)
这将匹配:
Xhttps://twitter.com/oppomobileindia/status/798397636780953600
注意第一个X字母。
我希望它匹配以双引号开头的网址。对于那些不以双引号开头的URL,也不包括https之前的第一个字符。
我在代码中使用的一个实际示例:
var str = "<div id=\"content\">
<p>https://twitter.com/oppomobileindia/status/798397636780953600</p>
<p>\"https://twitter.com/oppomobileindia/status/11111111111111111111</p></div>";
var pattern = @"(?<!""')https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)";//
var rgx = new Regex(pattern);
var results = rgx.Replace(str, "XXX");
在上面的示例中,只应替换第一个URL,因为第二个URL在URL之前具有双引号。它也应该在完全匹配时替换,而不是匹配字符串之前的第一个字母。
答案 0 :(得分:2)
使用(?<!")
负面反馈:
var re = @"(?<!"")https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)";
(?<!")
表示当前位置之前不能有"
。
在C#中,您不需要在模式中转义/
,因为在定义正则表达式时不使用正则表达式分隔符。
关于C#语法的注意事项:如果要在逐字字符串文字中定义"
,请将其加倍。在常规字符串文字中,转义"
和\
:
var re = "(?<!\")https?://twitter\\.com/(?:#!/)?(\\w+)/status(?:es)?/(\\d+)";