在正则表达式中使用引号,在 C# 中使用引号

Posted

技术标签:

【中文标题】在正则表达式中使用引号,在 C# 中使用引号【英文标题】:use quotation marks in regex, in quotation marks in C# 【发布时间】:2012-06-28 08:26:15 【问题描述】:

注意:本题中的所有引号实际上都是代码的一部分。

我正在学习正则表达式,我正在尝试抓取一个带有音乐的网站。我将网站的源代码放入一个名为“ytcmusic.txt”的文本文件中。以下是 html 示例:

<li><a href="angelpool%20-%20know.mp3"> angelpool - know.mp3</a></li>
<li><a href="angelpool%20-%20sellout.mp3"> angelpool - sellout.mp3</a></li>
<li><a href="angelpool%20-%20time.mp3"> angelpool - time.mp3</a></li>
<li><a href="bella%20-%20gibsons.mp3"> bella - gibsons.mp3</a></li>

我将以第一行为例,我试图只抓取“angelpool%20-%20know.mp3”,这是我使用的正则表达式:“.*.mp3”—— ----当我把它放到C#中时,我必须用引号将它括起来,这会破坏正则表达式中的引号。继承人的代码(它不编译,如果你删除正则表达式周围的一组引号,它会但显然不返回源的正确部分):

var sr = new StreamReader("ytcmusic.txt");
        string str = sr.ReadToEnd();
        var match = Regex.Match(str, @".*.mp3");

提前致谢!

【问题讨论】:

【参考方案1】:

这样就可以了

"[^"]*"

请注意,我会让您保留您的示例输入,并假设标题是唯一引用的内容。如果不是这种情况,您必须在正则表达式中添加更多上下文。

如果你想在没有引号的情况下捕获,你可以像这样引入括号

"([^"]*)"

在 C# 中,这变成了

StringCollection resultList = new StringCollection();
Regex regexObj = new Regex("\"([^\"]*)\"");
Match matchResult = regexObj.Match(subjectString);
while (matchResult.Success) 
    resultList.Add(matchResult.Groups[1].Value);
    matchResult = matchResult.NextMatch();
 

【讨论】:

对不起,我有点菜鸟,我该如何将它添加到我的代码中?我尝试了几种不同的错误方法。谢谢 如果您知道每个文件将位于 1 行,最好逐行读取和匹配。此外,* 是贪婪的或最大的,因此将尽可能匹配以满足前面的表达式,例如第一个引号直到最后一个引号。添加一个?在 * 之后使其不贪婪并尽可能少地匹配。 @SimonHalsey 我听到了,但是由于使用了否定字符类,因此它不会贪婪并且根本不会导致回溯。这是一种常见的技术,也是惰性匹配的替代方法,可能涉及(大量)回溯。 不知道否定类是非贪婪的。很容易知道。 抱歉,我花了一点时间才选择这个作为正确答案,我有点忙。刚刚试了一下,效果很好!谢谢!

以上是关于在正则表达式中使用引号,在 C# 中使用引号的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用正则表达式过滤多行双引号字符串

c# 正则表达式引号

如何使用 C# 和正则表达式删除引号 (") 内的所有逗号

寻找正则表达式以在大字符串中查找带引号的换行符(对于 C#)

正则表达式 - 获取引号中的字符串忽略转义的引号和评论

正则表达式 (C#):匹配 > < 或(非法 XML 字符)但仅当包含在引号内时