民间,
给定要解析的字符串:"Hello " & """world!"""
是否有可能最终得到两个匹配:"Hello"
和"""world!"""
我顺便解析VB代码,我试图找到字符串。它们总是双引号,但内部重复的双引号可能与C#中的@"Hello ""world!"""
太相似。
我对任何建议持开放态度!我的代码解析器将用C#btw。
编写我使用"[^"]+"
或".+?"
作为我的试验的基础,但无法弄清楚如何获得所需的结果。
答案 0 :(得分:3)
您的"[^"]+"
将在"
后的第一个"
停止,因此,您不会将"xx""z"""
子字符串作为输出,您将只获得"xx"
}。与".*?"
相同,因为您没有限制第二个"
的直接上下文(并且除非您指定RegexOptions.Singleline
标志,否则第二个正则表达式也会遇到换行符号。)
您可以使用following regex,它也会匹配引号内的转义序列:
"[^"\\]*(?:(?:\\.|"")[^"\\]*)*"
或针对您的案例进行简化:
"[^"]*(?:""[^"]*)*"
请参阅another demo。
后者的正则表达式解释:
"
- 匹配"
[^"]*
- 匹配"
(?:""[^"]*)*
- 匹配0个或更多个序列...
""
- 连续2次引用[^"]*
- 除"
"
- 匹配"
在C#中,您可以使用逐字字符串文字(您需要使用""
表示一个文字"
)或常规字符串文字(您需要使用\"
的地方)表示"
并使用特殊正则表达式元字符的双转义来声明这些正则表达式。
逐字:
var rx = new Regex(@"""[^""]*(?:""""[^""]*)*""");
常规字符串文字:
var rx = new Regex("\"[^\"]*(?:\"\"[^\"]*)*\"");
我认为在这种情况下,常规字符串文字声明更清晰。