C# 未识别的转义序列

4
我在C#中有以下正则表达式,它导致错误:C#无法识别转义序列\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=" "-字符处“结束”。

请问有谁可以帮助我吗?


你认为在不使用正则表达式的情况下有什么替代方案吗?当尝试获取HTML页面中大量项目时,选择并不多。 - Michael Hartmann
2
使用专门设计用于解析HTML的工具,如HTML Agility Pack。它可以解析所有的HTML标记,并让您将它们拆分并进行任何需要的操作。 - Scott Chamberlain
1
我正在使用HTML Agility包,但因为我解析的网站似乎不是动态的,我认为他们手动发布文章。这意味着有时网站结构会发生变化。因此,我决定尝试使用正则表达式来处理那些我已经看到过变化的部分。 - Crazywako
可能是一个重复问题:路径字符串包含反斜杠的转义字符没有被识别 - JasonMArcher
4个回答

11

使用@字面量时,使用""来转义引号。


这是正确的答案...只是无法将其标记为已解决,因为它有15分钟的阻止时间。已标记!谢谢。 - Crazywako

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\.\/:]+"">";
< p > @ 防止 C# 尝试将字符串中的 \ 解释为转义字符,但由于 \" 也不会被识别,因此他们发明了 "" 来转义双引号。 < /p >

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"。你的问题在于:正斜杠不需要转义,图片部分缺少左括号,将)放在分组结束的正确位置。

然而,正如已经说过很多次的那样,HTML结构不够严谨,无法被正则表达式完全捕获。但是如果你需要快速粗略地完成某些工作,它还是可以胜任的。


1
+1,但你还有几个不必要的反斜杠。实际上,你真正需要的只有两个\w出现的地方。 - Alan Moore
你是正确的。编辑后删除了大部分内容。我保留了 . 前面的一个,因为否则它将匹配任何字符而不仅仅是句号,这显然是不好的... - Shlomo
1
不,那个也可以去掉。在字符类中,“.”只匹配一个点。 - Alan Moore
不知道这一点。已测试,你是正确的。已进行编辑以确保正确性。 - Shlomo

0
这是问题所在。C#字符串识别特定的字符组合作为特殊字符来操作字符串。例如,您可能熟悉在字符串中插入\n作为换行符的用法?
当您在字符串中放置单个\时,它将尝试将其与下一个字符一起验证为这些特殊命令之一,并在不是有效组合时抛出错误。
幸运的是,这并不妨碍您使用反斜杠作为其中一个序列,\\可以用于此目的,被解释为单个反斜杠。
因此,在实践中,如果您将字符串中的每个反斜杠替换为双反斜杠,它应该正常工作。

我很欣赏你的努力,但你能否举个例子详细说明一下? - Silvermind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接