在正则表达式中使用引号,在 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# 中使用引号的主要内容,如果未能解决你的问题,请参考以下文章