C#无法识别的转义序列

本文关键字:转义序列 识别 | 更新日期: 2023-09-27 18:11:07

我在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 处"结束">

有人能帮我吗?

C#无法识别的转义序列

使用@文字时,使用""转义引号。

这里有两种转义机制,它们相互干扰。例如,您使用'"来告诉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#试图将字符串中的'解释为转义符,但由于'"届时也不会被识别,因此他们发明了""来转义双引号。

这里有一个更好的正则表达式,您的正则表达式充满了问题:

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

var m=正则表达式。匹配(@"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的结构不足以被regex捕获。但如果你需要快速而肮脏地完成一些事情,它就可以了。

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

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