如何在 C# 中将字符串中的所有内容捕获到单独的组中? [复制]

Posted

技术标签:

【中文标题】如何在 C# 中将字符串中的所有内容捕获到单独的组中? [复制]【英文标题】:How to capture everything in a string into separate groups in C#? [duplicate] 【发布时间】:2019-10-03 18:58:12 【问题描述】:

我在一个文件中有一些数据,我正在使用Regex 来获取单个元素并删除<opening></closing> 标记之间的所有\r\n

但是当我尝试单独选择elements 时,最后,整个数据被选为一组。

这是我的正则表达式:

(<([ph0-9figc]+)>)([a-zA-Z0-9äöüÄÖÜß[:punct:] \n\r\t])+(<\/\2>)

Input Data 示例

【问题讨论】:

该数据看起来不应该以某种方式发布.. + 正则表达式不适合匹配嵌套数据 不要使用正则表达式解析 XML。使用 XML 解析器。 您的描述似乎适合 html 格式,请查看 .net 相关的 HTML 类。我猜你想说“在&lt;data&gt;(开始标签)和&lt;/data&gt;(结束标签)之间” 查看我对this question 的回答,了解一些代码,可以帮助您了解哪些文本已保存到捕获中。 请看What should I do when someone answers my question? 【参考方案1】:

使用正则表达式执行此任务可能不是最好的主意,尤其是替换新行时。

如果我们真的需要,我们可能想要一个一个地捕获这些标签。例如,此表达式仅使用三个捕获组() 捕获p 标签:

(<p>)([\s\S]*?)(<\/p>)

regex101.com.

正则表达式电路

我们还可以在jex.im中可视化您的表情:

javascript 演示

const regex = /(<p>)([\s\S]*?)(<\/p>)/gm;
const str = `<p>
<st>Liebe stern-Redaktion,
</st> 
<i>Liebe stern-Redaktion,</i> warum schreiben Sie nicht, was wirklich freitags whrend der Protest-Demos am Grenzzaun passiert? Wie die Familien der Mrder fr jede gettete jdische Person belohnt werden? Oder ber die Feuerballons, die aus dem Gazastreifen in den Sden Israels geschickt werden? Brita Singh, Scheeel</p>
<fig>
<img src="images/img_8-1.jpg"    />
<fc>
<i>stern</i> Nr. 10/2019, Bild der Woche: Kindertrauer im Gazastreifen</fc>
</fig>	
<p>
<i>Sehr geehrte Frau Singh,</i> bei Demonstrationen am Grenzzaun starben laut Bericht der UN-Kommission in neun Monaten 35 Kinder durch Schüsse israelischer Soldaten. Zwei Journalisten und drei Sanitäter wurden erschossen, über 6000 Menschen verletzt. Israel hat gerade Ermittlungen zu elf der Todesfälle aufgenommen. Dagegen hat es in dem Zeitraum kein israelisches Todesopfer am Grenzzaun zu Gaza gegeben. Die Hamas pflegt einen Märtyrerkult und belohnt Morde mit Geld; israelische Sicherheitskräfte zerstören Häuser von Angehörigen palästinensischer Attentäter. Beides fördert den Hass. Opfer sind Menschen wie das Mädchen auf diesem Bild. Der <i>stern</i> hat keinen einseitigen Blick auf die Komplexität des Nahostkonflikts wir schauen stets auf beide Seiten. <i>Mit freundlichen Grüßen Cornelia Fuchs, Ressortleiterin Ausland</i></p>
<p>Eine liebevolle Mutter will, dass ihr Kind glücklich ist, egal, ob sie sein Leben versteht. Alles andere ist Egoismus und keine Mutterliebe. </p>
<p>Annemarie Fischer, Wielenbach</p>`;
let m;

while ((m = regex.exec(str)) !== null) 
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) 
        regex.lastIndex++;
    
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => 
        console.log(`Found match, group $groupIndex: $match`);
    );

C# 测试

using System;
using System.Text.RegularExpressions;

public class Example

    public static void Main()
    
        string pattern = @"(<p>)([\s\S]*?)(<\/p>)";
        string input = @"<p>
<st>Liebe stern-Redaktion,
</st> 
<i>Liebe stern-Redaktion,</i> warum schreiben Sie nicht, was wirklich freitags whrend der Protest-Demos am Grenzzaun passiert? Wie die Familien der Mrder fr jede gettete jdische Person belohnt werden? Oder ber die Feuerballons, die aus dem Gazastreifen in den Sden Israels geschickt werden? Brita Singh, Scheeel</p>
<fig>
<img src=""images/img_8-1.jpg"" 596"" 428"" "" />
<fc>
<i>stern</i> Nr. 10/2019, Bild der Woche: Kindertrauer im Gazastreifen</fc>
</fig>  
<p>
<i>Sehr geehrte Frau Singh,</i> bei Demonstrationen am Grenzzaun starben laut Bericht der UN-Kommission in neun Monaten 35 Kinder durch Schüsse israelischer Soldaten. Zwei Journalisten und drei Sanitäter wurden erschossen, über 6000 Menschen verletzt. Israel hat gerade Ermittlungen zu elf der Todesfälle aufgenommen. Dagegen hat es in dem Zeitraum kein israelisches Todesopfer am Grenzzaun zu Gaza gegeben. Die Hamas pflegt einen Märtyrerkult und belohnt Morde mit Geld; israelische Sicherheitskräfte zerstören Häuser von Angehörigen palästinensischer Attentäter. Beides fördert den Hass. Opfer sind Menschen wie das Mädchen auf diesem Bild. Der <i>stern</i> hat keinen einseitigen Blick auf die Komplexität des Nahostkonflikts wir schauen stets auf beide Seiten. <i>Mit freundlichen Grüßen Cornelia Fuchs, Ressortleiterin Ausland</i></p>
<p>Eine liebevolle Mutter will, dass ihr Kind glücklich ist, egal, ob sie sein Leben versteht. Alles andere ist Egoismus und keine Mutterliebe. </p>
<p>Annemarie Fischer, Wielenbach</p>";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        
            Console.WriteLine("'0' found at index 1.", m.Value, m.Index);
        
    

【讨论】:

【参考方案2】:

如果您愿意接受额外的“_”和其他空白字符,那么我将您的模式简化如下:

var pat = @"(<(?'tag'[ph0-9figc]+)>)(?'body'([\wäöüÄÖÜß\pP\s])+)(<\/\k'tag'>)";

去掉CR-LF的正则表达式是:

var body = m.Groups["body"].Value
   .Replace(Environment.NewLine, " ")
   .Replace("\r", " ")
   .Replace("\n", " ");
var tag = m.Groups["tag"].Value;
var noCrLf = re.Replace(text, m => $"<tag>body</tag>");

虽然查看了您的数据,但我可能不明白您的目标是什么。例如,您的标签之一与您的标签模式“[ph0-9figc]+”不匹配。如果我不理解您的顾虑,请纠正我。

【讨论】:

以上是关于如何在 C# 中将字符串中的所有内容捕获到单独的组中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获从 SQL Server 到 C# 应用程序的消息选项卡的所有内容?

AWK:从线型访问捕获的组

如何在 C# 中将 .json 文件转换为字符串 [重复]

java - 如何在java中将字符串元素拆分为不相交的组?

如何仅替换捕获的组?

Lua gmatch 将捕获的组存储为数组