如何为当前没有<span>元素的字符串中的字符添加跨度?

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

 "<span>X</span>間違<span>う</span><span>ABCDE</span>"

如何将跨度添加到尚未具有跨度的元素中,因此字符串如下所示:

 "<span>X</span><span>間</span><span>違</span><span>う</span><span>ABCDE</span>"

我可以用Regex做些什么吗?

示例2来源

"<span>X</span>A<span>う</span>ABC<span>Y</span>"

示例2的结果

"<span>X</span><span>A</span><span>う</span><span>A</span><span>B</span><span>C</span><span>Y</span>" 

示例3来源:

"間違<span>う</span>"

示例3的结果:

"<span>間</span><span>違</span><span>う</span>

示例4来源:

"<span>う</span>間違"

示例4结果:

"<span>う</span><span>間</span><span>違</span>"

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

mmp634174342 回答:如何为当前没有<span>元素的字符串中的字符添加跨度?

(根据新示例进行了更新)

正则表达式将无法使用html。请参阅RegEx match open tags except XHTML self-contained tags

已被警告,我想将正则表达式用于html

类似的事情可以完成任务。

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

请注意,这不会将未拆分的单词拆分成小段;它将把它们包裹起来。由于未将已包裹在跨度中的单词拆分,因此这似乎是合理的。


测试

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

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

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

由于您处理的字符串实际上不是HTML而是带有非嵌套span标签的纯文本,因此可以将正则表达式<span></span>视为正则来解决此问题。结束定界符。

您可以捕获文本并将其保留在两个标签之间,并在其他情况下与其他任何字符匹配:

var pattern = @"(?s)(<span(?:\s+[^>]*)?>.*?</span>)|\P{M}\p{M}*";
var result = Regex.Replace(text,pattern,x => 
    x.Groups[1].Success ? x.Groups[1].Value : $"<span>{x.Value}</span>");

如果将.*?</span>替换为[^<]*(?:<(?!</span>)[^<]*)*,该模式将变得更加有效:

var pattern = @"(<span(?:\s+[^>]*)?>[^<]*(?:<(?!/span>)[^<]*)*</span>)|\P{M}\p{M}*";

详细信息

  • (<span(?:\s+[^>]*)?>[^<]*(?:<(?!/span>)[^<]*)*</span>)-第1组:匹配并捕获一个
    • <span-文字子字符串,然后是
    • (?:\s+[^>]*)?>-可选的1+个空格,后跟0+个除>之外的字符
    • [^<]*-除<以外的0+个字符,后跟
    • (?:<(?!/span>)[^<]*)*-0次或多次出现的<,之后没有/span>,然后是除<以外的任何0+字符,然后是
    • </span>-</span>文字
  • |-或
  • \P{M}\p{M}*-任何Unicode字素。

如果第1组参加了比赛,x.Groups[1].Success ? x.Groups[1].Value : $"<span>{x.Value}</span>")逻辑将还原第1组的值,否则,将使用span标签包装匹配的char。

,

您可以剥离标签以获取纯文本,然后将标签添加到每个字符。

示例:

    var span = "<span>X</span>間違<span>う</span><span>Y</span>";

    var plain = span.Replace("<span>","").Replace("</span>","").Trim();

    var sb = new StringBuilder(string.Empty); 

    for(int x =0; x < plain.Length; x++)
    {
        sb.Append($"<span>{plain[x]}</span>");

    }
本文链接:https://www.f2er.com/3169995.html

大家都在问