【问题标题】:Match all lines prefixed with four spaces匹配所有以四个空格为前缀的行
【发布时间】:2011-04-30 22:30:43
【问题描述】:

我正在尝试用 pre 标签包装所有以 4 个空格字符为前缀的行。这就是我目前所拥有的

Text = Text.replace(new RegExp("( {4}.+?)<br />", "g"), "$1\n");
Text = Text.replace(new RegExp("( {4}.+?)\n", "g"), "<pre class=\"brush: js;\">$1</pre>");

它可以工作,但它将每一行都包含在pre 中。我需要它来包裹整个街区。

【问题讨论】:

  • 您的正则表达式是否应该以 ^ 开头,以防一行中间有 4 个空格?我知道这对你的问题没有帮助,只是想我会指出来。

标签: javascript regex


【解决方案1】:

也许这样的事情会起作用?它匹配一行中的多行..

( {4}.*(\n {4}.*)*)\n

【讨论】:

    【解决方案2】:

    你真的需要用正则表达式来做这件事吗?正则表达式很酷且很有用,但它们并不是您工具箱中的唯一工具,有时最好直接做一些事情并继续解决实际问题。我只是将它分解成几行,然后用一个累加器逐行解析它,以获取需要预先确定的东西:

    var lines = text.split('\n');
    var pre   = [ ];
    var out   = [ ];
    for(var i = 0; i < lines.length; ++i) {
        if(lines[i].match(/^    /)) {
            pre.push(lines[i]);
        }
        else if(pre.length > 0) {
            out.push('<pre>' + pre.join('\n') + '</pre>' + '\n');
            out.push(lines[i]);
            pre = [ ];
        }
        else {
            out.push(lines[i]);
        }
    }
    if(pre.length > 0) {
        out.push('<pre>' + pre.join('\n') + '</pre>' + '\n');
    }
    text = out.join('\n');
    

    这可能不像一个难以理解的正则表达式那么聪明,但至少你可以在六个月后理解它在做什么。

    http://jsfiddle.net/ambiguous/tFNyv/

    【讨论】:

      【解决方案3】:

      请尝试:

      Text = Text.replace(new RegExp("(( {4}.+?\n)+)", "g"), "<pre class=\"brush: js;\">$1</pre>");
      

      假设
      替换已经完成。

      它适用于:

          lalalal
          noway it's block1
          greetings
      
          foobar
          block2
          indeed block2
      

      并生成,换行符被隐藏:

      <pre class="brush: js;">    lalalal
          noway it's block1
          greetings
      </pre>
      <pre class="brush: js;">    foobar
          block2
          indeed block2
      </pre>
      

      【讨论】:

      • OP 说:它可以工作,但它将每一行都包装在 pre.我需要它来包裹整个街区。
      • 是的,OP 没有说明什么是块,所以我假设一个块被不是块元素的东西破坏了。只要他不回答我的评论,我就不会改变解决方案。
      【解决方案4】:

      尝试:

      $.each(text.split('\n'), function(index, value)
      {
          var t = value.replace(/^[\s]{4}(.*)$/, "<pre>$1</pre>");
          $("body").append(t);
      });
      

      http://jsfiddle.net/jotapdiez/zx8Pg/

      【讨论】:

        【解决方案5】:

        听起来提问者想要进行类似降价的转换。这个问题与这个问题类似:How do I fix this multiline regular expression in Ruby?。如果想要的效果是模拟 markdown 代码转换,请考虑以下内容(改编自我接受的对 ruby​​ 问题的回答):

        var re = /(\r?\n)((?:(?:\r?\n)+(?:[ ]{4}|\t).*)+\r?\n)(?=\r?\n)/mg;
        text = text.replace(re, '$1<pre class="brush: js">$2</pre>');
        

        【讨论】:

          猜你喜欢
          • 2016-03-15
          • 2018-09-03
          • 1970-01-01
          • 1970-01-01
          • 2018-04-21
          • 1970-01-01
          • 2019-02-23
          • 2022-01-24
          • 2016-04-16
          相关资源
          最近更新 更多