C#无法识别的转义序列

时间:2013-04-25 22:35:40

标签: c# regex

我在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

有人可以帮我吗?

4 个答案:

答案 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作为行尾字符? 当您在字符串中放置一个\时,它将尝试将其与下一个字符一起作为这些特殊命令之一进行验证,并且当它不是有效组合时将抛出错误。 幸运的是,这并不妨碍您使用反斜杠,因为其中一个序列\\可用于此目的,被解释为单个反斜杠。

所以,实际上,如果你用字符串中的每个反斜杠替换双反斜杠,它应该可以正常工作。