gpt4 book ai didi

c# - 需要在 C# 正则表达式中提取文本

转载 作者:行者123 更新时间:2023-12-03 22:58:51 24 4
gpt4 key购买 nike

我有一组字符串,例如 Some song [FEAT. John Doe],我正在尝试提取“特色”部分。它可以通过几个不同的单词 "FEAT|FEAT\\.|Featuring" 之一来标识,并且可以用括号括起来,也可以不用括号括起来。我为此使用了正则表达式,这是我到目前为止所得到的:

[TestMethod]
public void ExtractFeaturedPerformers()
{
IEnumerable<string> titles = new string[]
{
"abc [FEAT one two] 123",
"def(FEAT. three'four) 456",
"ghi Featuring five",
"jkl"
};

// Must be able to use an arbitrary array of words
var arrayOfWords = new string[] { "FEAT", "FEAT.", "Featuring" };
string options = string.Join("|", arrayOfWords.Select(s => Regex.Escape(s)));
var result = new List<string>();

foreach(string title in titles)
{
var _ = Regex.Match(title, $@"(?<=({options})\s*)(.*?)(?=[\]\)]|$)");
if (_.Success)
result.Add(_.Value);
}

Assert.AreEqual(3, result.Count());
Assert.IsTrue(result.Contains("one two"));
Assert.IsTrue(result.Contains("three'four"));
Assert.IsTrue(result.Contains("five"));
}
我有它主要工作,但有两个限制。我的主要问题是第二个结果包含 .. three'four如何将其作为 Regex 的一部分删除,以便我可以接受任意 options 字符串而不是稍后将其剥离?处理 . 是我主要关心的问题,但我也很感激有关从结果中删除前导和尾随空格的建议,以便我以后不必调用 Trim()

最佳答案

你需要

(?:FEAT\.?|Featuring)\s*([^])]*)
查看 regex demo
细节
  • (?:FEAT\.?|Featuring) - FEAT 和可选的 .Featuring
  • \s* - 零个或多个空格
  • ([^])]*) - 捕获组 1:除 ]) 之外的零个或多个字符。

  • 您需要修改 C# 代码以获取 Group 1 值。
    这是 full C# demo :
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;

    public class Test
    {
    public static void Main()
    {
    IEnumerable<string> titles = new string[]
    {
    "abc [FEAT one two] 123",
    "def(FEAT. three'four) 456",
    "ghi Featuring five",
    "jkl"
    };

    var keys = new List<string> { "FEAT", "FEAT.", "Featuring" };
    keys = keys.OrderByDescending(x => x.Length).ToList();
    var pattern = $@"(?:{string.Join("|", keys.Select(z => Regex.Escape(z)))})\s*([^])]*)";
    Console.WriteLine(pattern);

    var result = new List<string>();
    foreach(string title in titles)
    {
    var _ = Regex.Match(title, pattern);
    if (_.Success)
    result.Add(_.Groups[1].Value);
    }

    Console.WriteLine( result.Count()); // Assert.AreEqual(3, result.Count());
    Console.WriteLine( result.Contains("one two") ); //Assert.IsTrue(result.Contains("one two"));
    Console.WriteLine( result.Contains("three'four") ); //Assert.IsTrue(result.Contains("three'four"));
    Console.WriteLine( result.Contains("five") ); // Assert.IsTrue(result.Contains("five"));
    }
    }
    输出是
    (?:Featuring|FEAT.|FEAT)\s*([^])]*)
    3
    True
    True
    True
    请注意正则表达式模式是如何构建的:
  • var keys = new List<string> { "FEAT", "FEAT.", "Featuring" }; 用搜索短语
  • 初始化 keys 字符串列表
  • keys = keys.OrderByDescending(x => x.Length).ToList(); - 按长度降序对列表中的项目进行排序
  • var pattern = $@"(?:{string.Join("|", keys.Select(z => Regex.Escape(z)))})\s*([^])]*)"; - 通过将转义的搜索短语放入非捕获组中来创建正则表达式模式,其中 | 交替运算符位于 (?:Featuring|FEAT\.|FEAT) 之间。
  • 关于c# - 需要在 C# 正则表达式中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67824809/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com