如何使用正则表达式创建<span>和</span>与</span>和<span>之间的所有数组?

时间:2019-11-03 21:00:59

标签: c# regex

我有接受此字符串并将其解析为字符数组的代码:

var textArray = Regex.Replace(text, @"</?span( [^>]*|/)?>",    
String.Empty).Trim().ToCharArray();

<span>そ</span><span>れ</span><span>に</span><span>も</span>拘<span>わ</span><span>ら</span>もも<span>ず</span>

但是现在我需要做一些不同的事情,而且我不确定该怎么做。我需要将这样的字符串解析成这样的数组:

そ
れ
に
も
拘
わ
ら
もも
ず

<span></span>之间的任何元素都是数组中的元素,</span><span>之间的任何元素都是数组中的元素。

感谢任何人就我如何使用Regex做到这一点提供的建议:

1 个答案:

答案 0 :(得分:0)

您可以使用

var textArray = Regex.Split(text, @"(?:</?span(?:\s+[^>]*)?>)+")
    .Where(x => !string.IsNullOrEmpty(x));

Regex.Split方法将根据匹配的字符串出现将字符串拆分为多个块。如果匹配发生在字符串边界,则将空项目添加到结果中,因此您需要使用.Where(x => !string.IsNullOrEmpty(x))

正则表达式匹配1次或多次出现的

  • <-<字符
  • /?-可选的/
  • span-span文字
  • (?:\s+[^>]*)?-可选的序列,包含1+个空格,然后是>以外的0个或更多字符
  • >-一个>字符。

请参见regex demo

非捕获组((?:...))很重要,因为Regex.Split还将所有捕获的子字符串添加到结果中。

或者,如果您只想抓取span打开/关闭标签之间的所有文本,则:

var textArray = Regex.Matches(text, @"(?s)<span(?:\s+[^>]*)?>(.*?)</span>")
        .Cast<Match>()
        .Select(x => x.Groups[1].Value);

请参见C# demo

在这里,<span(?:\s+[^>]*)?>匹配span和标记的所有内部部分,(.*?)捕获内部文本,</span>匹配结束标记。