【问题标题】:Regular expressions, capture group正则表达式,捕获组
【发布时间】:2014-05-24 22:59:27
【问题描述】:

这将是示例文本:

<option value="USD">American Samoa, United States Dollar (USD)</option>
<option value="EUR">Andorra, Euro (EUR)</option>
<option value="AOA">Angola, Kwanza (AOA)</option>
<option value="XCD">Anguilla, East Caribbean Dollar (XCD)</option>
<option value="XCD">Antigua and Barbuda, East Caribbean Dollar (XCD)</option>
<option value="ARS">Argentina, Peso (ARS)</option>

这是我的尝试:

&lt;option selected="selected" value="[A-Z]{3}"&gt;(?&lt;Test&gt;).+&lt;/option&gt;.

问题是,它只匹配它找到的第一个匹配项。虽然我希望它得到所有。我在尝试中遗漏了什么?

【问题讨论】:

  • 我在问题中看不到任何 c# 代码。你选错标签了吗?还是有什么你没有分享的?
  • 首先:正则表达式 - 不适合解析 HTML。其次 - 您的正则表达式与上述文本中的任何元素都不匹配。你能展示你的 C# 代码吗?
  • 大家好,对不起,我目前正在使用 Expresso(比 F5/shift F5 快得多)来测试它。之后,我将在 C# 中完成。但是你为什么说它不匹配任何东西?我不得不说我只复制了几行。我正在针对所有货币进行此操作。
  • 它不匹配任何东西,因为你试图匹配 select="selected" 并且它们都没有这个属性
  • 不是因为您在文本中只选择了 1 个选项吗?您通过在您的正则表达式中使用 selected="selected" 来匹配。

标签: c# regex regex-group expresso


【解决方案1】:

不推荐使用正则表达式进行 HTML 解析。

为什么不使用 HTML Agility Pack?

http://htmlagilitypack.codeplex.com/

这是一个例子:

 HtmlDocument doc = new HtmlDocument();
 doc.LoadHtml("YOUR HTML STRING");
 foreach(HtmlNode node in doc.DocumentElement.SelectNodes("//select/option[@selected='selected']")
 {
    string text = node.InnerHtml;                  // "American Samoa, United States Dollar (USD)"
    string value = node.Attributes["value"].Value; // "USD"
 }

你也可以通过 NuGet 下载 =)

如果你喜欢这个解决方案,你可以阅读更多关于 XPath 的内容:

http://www.w3schools.com/XPath/xpath_syntax.asp

如果你还想使用Regex,可以查看这个网站:

http://www.jslab.dk/tools.regex.php

【讨论】:

  • 嗨,听起来很有趣。不知道这个包。这正是我需要的,只是选项标签之间的文本。谢谢!
  • 不客气@Quoter.. 如果您需要帮助,请告诉我 =)
【解决方案2】:

你是在说类似这样的正则表达式吗:

<option value=""[A-Z]{3}""[^<]*</option>

这是一个完整的 C# 程序,请参阅live C# demo 底部的输出。

using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program {
static void Main()    {
string s1 = @"<option value=""USD"">American Samoa, United States Dollar (USD)</option>
<option value=""EUR"">Andorra, Euro (EUR)</option>
<option value=""AOA"">Angola, Kwanza (AOA)</option>
<option value=""XCD"">Anguilla, East Caribbean Dollar (XCD)</option>
<option value=""XCD"">Antigua and Barbuda, East Caribbean Dollar (XCD)</option>
<option value=""ARS"">Argentina, Peso (ARS)</option>";
var myRegex = new Regex(@"<option value=""[A-Z]{3}""[^<]*</option>");
MatchCollection AllMatches = myRegex.Matches(s1);

Console.WriteLine("\n" + "*** Matches ***");
if (AllMatches.Count > 0)    {
    foreach (Match SomeMatch in AllMatches)    {
        Console.WriteLine("Overall Match: " + SomeMatch.Value);
            }
}

Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();
} // END Main
} // END Program

【讨论】:

  • 不,我需要选项标签中的所有内容。 Crasher 提出了一个不错的解决方案,应该可以。感谢您的帮助。
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2018-09-08
  • 2021-06-01
  • 2021-09-06
相关资源
最近更新 更多