首页 > 解决方案 > 如何将跨度添加到当前没有元素的字符串中的字符?

问题描述

我有看起来像这样的字符串:

 "<span>X</span>間違<span>う&lt;/span><span>ABCDE</span>"

如何将跨度添加到已经没有跨度的元素,使字符串看起来像这样:

 "<span>X</span><span>間&lt;/span><span>違&lt;/span><span>う&lt;/span><span>ABCDE</span>"

这是我可以用正则表达式做的事情吗?

示例 2 来源

"<span>X</span>A<span>う&lt;/span>ABC<span>Y</span>"

示例 2 结果

"<span>X</span><span>A</span><span>う&lt;/span><span>A</span><span>B</span><span>C</span><span>Y</span>" 

示例 3 来源:

"間違<span>う&lt;/span>"

示例 3 结果:

"<span>間&lt;/span><span>違&lt;/span><span>う&lt;/span>

示例 4 来源:

"<span>う&lt;/span>間違"

示例 4 结果:

"<span>う&lt;/span><span>間&lt;/span><span>違&lt;/span>"

请注意,只有没有跨度的字符我需要为每个字符添加跨度。我希望这是有道理的。所以在第一种情况下,“ABCDE”需要保持为“ABCDE”。

标签: c#regex

解决方案


(根据新示例更新)

正则表达式对于 html 将失败。请参阅RegEx 匹配开放标签,XHTML 自包含标签除外

我被警告过,我想对 html 使用正则表达式

像这样的东西可以完成这项工作。

Regex.Replace(input, "(^|</span>)(.*?)(<span>|$)", "$1<span>$2</span>$3");

请注意,这不会拆分单词,不会包裹在 spans 中;它只会将它们包装在跨度中。由于已经包含在 span 中的单词不会被拆分,这似乎是合理的。


测试

string input = "間違<span>う&lt;/span>X<span>ABC</span>Y<span>DEF</span>GHI";

Console.WriteLine(input);
var replaced = Regex.Replace(input, "(^|</span>)(.*?)(<span>|$)", "$1<span>$2</span>$3");

Console.WriteLine(replaced);
間違<span>う&lt;/span>X<span>ABC</span>Y<span>DEF</span>GHI
<span>間違</span><span>う&lt;/span><span>X</span><span>ABC</span><span>Y</span><span>DEF</span><span>GHI</span>

推荐阅读