【问题标题】:How to extract multiple substring matches from string in C#?如何从 C# 中的字符串中提取多个子字符串匹配项?
【发布时间】:2017-04-26 04:00:45
【问题描述】:

我有一个字符串包含具有类似模式的标记内容,如下所示:

This is a <ss type="">(example)</ss> string which <ss type="">(contains)</ss> tagged contents.

预期结果是:

This is a <ss type="example">(example)</ss> string which <ss type="contains">(contains)</ss> tagged contents.

我尝试通过RegularExpression提取标记内容列表,并提取了标记文本列表,并将标记文本放在双引号中作为type的值,并将新字符串替换为旧字符串一个。

但问题是,由于Regex.Replace(); 遵循相同的Regex 模式,它会将所有标记的内容替换为标记内容列表的最后一个元素,如下所示:

This is a <ss type="contains">(contains)</ss> string which <ss type="contains">(contains)</ss> tagged contents.

我的工作代码如下:

StringBuilder resultText= new StringBuilder(@"This is a <ss type="">(example)</ss> string which <ss type="">(contains)</ss> tagged contents.");
string overallPattern = @"<ss\stype=""([a-zA-Z]*)"">(.*?)</ss>";
List<string> matchList = new List<string>();
List<string> contentList = new List<string>();
StringBuilder sb;
Regex overallRegex = new Regex(overallPattern, RegexOptions.None);
string resultContent = resultText.ToString();
foreach (Match match in overallRegex.Matches(resultContent))
     {
        string matchResult = match.ToString();
        matchList.Add(matchResult);
        string content = matchResult.Split('(', ')')[1];
        contentList.Add(content);
     }
for (int j = 0; j < matchList.Count; j++)
     {
        sb = new StringBuilder();
        sb.Append(matchList[j].Insert(10, string.Format(contentList[j])));
        resultContent = Regex.Replace(resultContent, overallPattern, sb.ToString());
        resultText = new StringBuilder();
        resultText.Append(resultContent);
     }

我的问题是:

如何按顺序将正确的标签文本放入其双引号中?

【问题讨论】:

  • 你检查过你的正则表达式模式吗?我发现它不匹配任何东西
  • 好吧,原因是这是一个 必须是这是一个 。我已经编辑了你的问题
  • @S.Petrosov 感谢您的努力。它匹配。实际上,该字符串来自其他带有双引号转义的地方,例如\"。我想它和你的一样。上面的字符串只是为了演示。

标签: c# asp.net regex


【解决方案1】:

您必须根据replace 的标签内容创建动态Regex。例如&lt;ss\stype="([a-zA-Z]*)"&gt;\(example\)&lt;\/ss&gt; 将仅替换一个内容中包含example 的标签。请检查一下,它会根据您的描述工作。

代码:

//StringBuilder resultText = new StringBuilder(@"This is a <ss type="""">(example)</ss> string which <ss type="""">(contains)</ss> tagged contents.");
//You have to use """" instead on "" in this line 
StringBuilder resultText = new StringBuilder(@"This is a <ss type="""">(example)</ss> string which <ss type="""">(contains)</ss> tagged contents.");
string overallPattern = @"<ss\stype=""([a-zA-Z]*)"">(.*?)</ss>";
List<string> matchList = new List<string>();
List<string> contentList = new List<string>();
StringBuilder sb;
Regex overallRegex = new Regex(overallPattern, RegexOptions.None);
string resultContent = resultText.ToString();
foreach (Match match in overallRegex.Matches(resultContent))
{
    string matchResult = match.ToString();
    matchList.Add(matchResult);
    string content = matchResult.Split('(', ')')[1];
    contentList.Add(content);
}
for (int j = 0; j < matchList.Count; j++)
{
    //Dynamic Regex based on tag content for replace
    overallPattern = @"<ss\stype=""([a-zA-Z]*)"">\("+ contentList[j] + "\\)</ss>";
    sb = new StringBuilder();
    sb.Append(matchList[j].Insert(10, string.Format(contentList[j])));
    resultContent = Regex.Replace(resultContent, overallPattern, sb.ToString());
    resultText = new StringBuilder();
    resultText.Append(resultContent);
}

以上代码的输出:

This is a &lt;ss type="example"&gt;(example)&lt;/ss&gt; string which &lt;ss type="contains"&gt;(contains)&lt;/ss&gt; tagged contents.

【讨论】:

  • 耶!这是工作!我不熟悉Regex,动态部分正是我困惑的地方。实际上我几乎就在那里。谢谢!
【解决方案2】:

你只需要替换

resultContent = Regex.Replace(resultContent, overallPattern, sb.ToString());

通过这个:

resultContent = resultContent.Replace(matchList[j], sb.ToString());

【讨论】:

  • 感谢您的努力。我做了这部分。但是你写的不是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2012-09-17
  • 1970-01-01
  • 2023-03-17
  • 2018-09-29
  • 2019-06-26
  • 2019-02-20
相关资源
最近更新 更多