替换前导空格并在特定字符之前终止匹配

时间:2012-02-17 10:23:22

标签: c# ruby regex

无法弄清楚如何为以下内容构建替换模式。

我有一系列如下所示的行:

<span> code <span> code <span/> code </span>
    <span> code <span> code <span/> code </span>
    <span> code <span> code <span/> code </span>
        <span> code <span> code <span/> code </span>

每行开头都有一个空格。它可以是一个空格,也可以是两个空格或N个空格。 在线本身的任何地方都可以有空格。

所需要的是仅在第一个<字符之前的行首处替换空格。 每个空格应替换为&nbsp;

因此,如果有1个空格字符 - 如果有2个空格,则应替换为&nbsp; - 应该是&nbsp;&nbsp;基本上,N个空格字符应替换为N &nbsp;

我可以肯定地使用代码,但这不是最佳选择。 我试图用纯正则表达式完全做到这一点,但无法弄清楚如何构建正确的模式。

欢迎任何语言(Ruby,C#,Python,Perl)的替换示例。

P.S。我正在逐行处理,所以它足以构建替换模式,它可以在一条线的边界内工作。

P.P.S。我很接近前瞻,但仍然无法弄清楚如何在第一次<之后停止替换空格。

3 个答案:

答案 0 :(得分:1)

在c#中这没问题

String s = "    <span> code <span> code <span/> code </span>";
Console.WriteLine(Regex.Replace(s, @"(?<=^\s*)\s", "&nbsp;"));

表示替换空白字符,但前提是只有空白字符和字符串的开头。

但所有其他语言都不支持可变长度的后视。

答案 1 :(得分:1)

Ruby中的方法

line.sub(/^( +)(?=<)/){'&nbsp;' * $1.length}

http://ideone.com/gVfPy

答案 2 :(得分:0)

红宝石中的双gsub:

str =  "    <span> code <span> code <span/> code </span>"
p str.gsub(/^ +/){|m| m.gsub(' ', '&nbsp;')}
#=> "&nbsp;&nbsp;&nbsp;&nbsp;<span> code <span> code <span/> code </span>"