【发布时间】:2021-08-21 18:35:34
【问题描述】:
我有一个字符串集合,例如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()了。
【问题讨论】: