4

我在 C# 上关注 Regex 及其导致 Error: C# Unrecognized escape sequence on \w \. \/ .

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

4 回答 4

10

使用文字""时用于转义引号@

于 2013-04-25T22:36:23.497 回答
4

这里有两种逃逸机制在起作用,它们相互干扰。例如,你\"用来告诉 C# 转义下面的双引号,但你也\w用来告诉正则表达式解析器对下面的 W 进行特殊处理。但是 C# 认为\w是为 C# 设计的,不理解它,你会得到一个编译器错误。

例如,以这个示例文本为例:

<a href="file://C:\Test\Test2\[\w\.\/:]+">

有两种方法可以逃避它,以便 C# 接受它。

一种方法是转义 C# 特有的所有字符。在这种情况下,"用于表示字符串的结尾,并\表示 C# 转义序列。两者都需要以 C# 转义为前缀\来转义它们:

string s = "<a href=\"file://C:\\Test\\Test2\\[\\w\\.\\/:]+\">";

但这通常会导致难看的字符串,尤其是与路径或正则表达式一起使用时。

另一种方法是在字符串前面加上前缀并仅通过替换它们来@转义:"""

string s = @"<a href=""file://C:\Test\Test2\[\w\.\/:]+"">";

@阻止 C# 尝试将\字符串中的 解释为转义字符,但由于\"也不会被识别,他们发明了""来转义双引号。

于 2013-04-26T01:45:38.910 回答
3

这是一个更好的正则表达式,你的充满了问题:

string reg = @"<a href=""[\w./:]+"" target=""_blank"">.?<img src=""(?<imgurl>[\w./:]+)""";
Regex regex = new Regex(reg);

var m = regex.Match(@"http://www.yahoo.com"" target=""_blank"">http://flickr.com/something.jpg""");

抓住<a href="http://www.yahoo.com" target="_blank"><img src="http://flickr.com/something.jpg"。你的问题:不需要转义正斜杠,在 img 部分缺少 [ 括号,将)在组的关闭中放在正确的位置。

然而,正如多次说过的,HTML 的结构不足以被正则表达式捕获。但是,如果你需要快速完成一些肮脏的事情,它会做的。

于 2013-04-25T23:04:48.830 回答
0

这是交易。C# 字符串将某些字符组合识别为特定的特殊字符来操作字符串。例如,也许您熟悉\n在字符串中插入 a 以用作行尾字符?当您将单个字符放入\字符串中时,它会尝试将其与下一个字符一起验证为这些特殊命令之一,并在其不是有效组合时抛出错误。幸运的是,这并不妨碍您使用反斜杠,因为其中一个序列 ,\\用于此目的,被解释为单个反斜杠。

因此,在实践中,如果将字符串中的每个反斜杠替换为双反斜杠,它应该可以正常工作。

于 2013-04-25T22:50:04.107 回答