我在C#上跟随Regex及其导致错误:\w
\.
\/
上的C#无法识别的转义序列。
string reg = "<a href=\"[\w\.\/:]+\" target=\"_blank\">.?<img src=\"(?<imgurl>\w\.\/:])+\"";
Regex regex = new Regex(reg);
我也试过
string reg = @"<a href="[w./:]+" target=\"_blank\">.?<img src="(?<imgurl>w./:])+"";
但是这样字符串“结束”在href =“"
- char
有人可以帮我吗?
答案 0 :(得分:9)
使用""
字面值时,使用@
来转义引号。
答案 1 :(得分:3)
这是一个更好的正则表达式,你的问题充满了:
string reg = @"<a href=""[\w./:]+"" target=""_blank"">.?<img src=""(?<imgurl>[\w./:]+)""";
Regex regex = new Regex(reg);
var m = regex.Match(@&#34; http://www.yahoo.com"&#34; 目标=&#34;&#34; _blank&#34;&#34;&GT; HTTP://flickr.com/something.jpg"&#34;&#34);
抓住<a href="http://www.yahoo.com" target="_blank"><img src="http://flickr.com/something.jpg"
。
你的问题:正斜杠不需要转义,错过了img部分的[括号,在组合结束时将)
置于正确的位置。
然而,正如已经多次说过的那样,HTML的结构不足以被正则表达式所捕获。但是如果你需要做一些快速和肮脏的事情,那就可以了。
答案 2 :(得分:3)
这里有两种逃避机制,它们会干扰。例如,您使用\"
告诉C#转义以下双引号,但您还使用\w
告诉正则表达式解析器处理以下W特殊。但是C#认为\w
适用于C#,不理解它,并且您得到编译器错误。
例如,采用此示例文本:
<a href="file://C:\Test\Test2\[\w\.\/:]+">
有两种方法可以逃避它,以便C#接受它。
一种方法是转义C#特有的所有字符。在这种情况下,"
用于表示字符串的结尾,\
表示C#转义序列。两者都需要以C#escape \
为前缀来逃避它们:
string s = "<a href=\"file://C:\\Test\\Test2\\[\\w\\.\\/:]+\">";
但这通常会导致丑陋的字符串,特别是与路径或正则表达式一起使用时。
另一种方法是在字符串前加@
前缀,并将"
替换为""
:
string s = @"<a href=""file://C:\Test\Test2\[\w\.\/:]+"">";
@
会阻止C#尝试将字符串中的\
解释为转义符,但由于\"
无法识别,因此他们发明了""
逃避双重报价。
答案 3 :(得分:0)
这是交易。 C#字符串将某些字符组合识别为操作字符串的特定特殊字符。例如,您是否熟悉在字符串中插入\n
作为行尾字符?
当您在字符串中放置一个\
时,它将尝试将其与下一个字符一起作为这些特殊命令之一进行验证,并且当它不是有效组合时将抛出错误。
幸运的是,这并不妨碍您使用反斜杠,因为其中一个序列\\
可用于此目的,被解释为单个反斜杠。
所以,实际上,如果你用字符串中的每个反斜杠替换双反斜杠,它应该可以正常工作。