如何在C#中从字符串中提取多个子字符串匹配?

3

我有一个字符串,其中包含类似以下模式的标记内容:

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);
     }

我的问题是:

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


你检查过正则表达式模式了吗?我看它没有匹配到任何内容。 - Samvel Petrosov
好的,原因是这是一个<ss type="">,必须是这个<ss type="""">。我已经编辑了你的问题。 - Samvel Petrosov
@S.Petrosov 感谢您的努力。它匹配了。实际上,该字符串来自其他地方,使用双引号转义符号 \"。我认为它与您的相同。上面的字符串只是用于演示。 - Almett
2个回答

2
你需要根据标签内容创建动态的正则表达式,以进行替换。例如,<ss\stype="([a-zA-Z]*)">\(example\)<\/ss>将仅替换内容中包含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);
}

以上代码的输出:

这是一个包含标记内容的<ss type="example">(example)</ss>字符串。


太棒了!它正在运行!我不熟悉Regex,动态部分正是我困惑的地方。实际上,我几乎到达了那里。谢谢! - Almett

0
你只需要替换

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

通过这个:

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

谢谢你的努力。我已经完成了这部分。但是你写的不完全是我想要的。 - Almett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接