如何删除两个字符串之间的换行符(RegEx)

时间:2014-10-26 14:06:48

标签: regex sublimetext2

我正在尝试在SublimeText2中开发一个快速黑客(不太理想,我知道):

我的标记中有这个(常用)代码:

{% url '
     someURL ' %}

如何使用正则表达式删除换行符,以便{% url 'someURL '%}

我成功地在括号之间选择了一些东西:

\{\%[\s\S]*?\%\}

但是,我无法弄清楚如何仅选择换行符\n并在其中加倍空格。

3 个答案:

答案 0 :(得分:3)

使用以下正则表达式,然后用一个空格替换匹配。

(?s)\s+(?=(?:(?!%}|\{%).)*%\})

DEMO

<强>解释

(?s)                     set flags for this block (with . matching
                         \n) (case-sensitive) (with ^ and $
                         matching normally) (matching whitespace
                         and # normally)
\s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                         more times)
(?=                      look ahead to see if there is:
  (?:                      group, but do not capture (0 or more
                           times):
    (?!                      look ahead to see if there is not:
      %}                       '%}'
     |                        OR
      \{                       '{'
      %                        '%'
    )                        end of look-ahead
    .                        any character
  )*                       end of grouping
  %                        '%'
  \}                       '}'
)                        end of look-ahead

答案 1 :(得分:1)

您可以使用此模式:

(?:\G(?!\A)|\{%)[^%\r\n]*\K(?:\r?\n)+(?=[^%]*%\})

替换是一个空字符串。

此模式可确保您始终使用与上一场比赛结束时的位置匹配的{%锚定位于%}\G之间。

\K从匹配结果中删除左侧匹配的所有内容。所以只删除了CRLF或LF。

如果要在标记之间允许%个字符,可以改进此模式:

(?:\G(?!\A)|\{%)(?:[^%\r\n]|%(?!\}))*\K(?:\r?\n)+(?=(?:[^%]|%(?!\}))*%\})

或更高效(如果可以使用sublimetext):

(?:\G(?!\A)|\{%)(?>[^%\r\n]+|%+(?!\}))*\K(?:\r?\n)+(?=(?>[^%]+|%+(?!\}))*%\})

稍短(如果sublimetext正则表达式引擎足够聪明):

(?:\G(?!\A)|{%)(?>[^%\r\n]+|%+(?!}))*\K\R+(?=(?>[^%]+|%+(?!}))*%})

注意:如果您确定标记始终是平衡的,则可以删除最后一个前瞻(但这种方式不太安全)

(?:\G(?!\A)|{%)(?>[^%\r\n]+|%+(?!}))*\K\R+

答案 2 :(得分:0)

(\{%.*)\n\s*(.*%\})

替换字符串\1\2将更改

{% url '
     someURL ' %}

{% url 'someURL ' %}