正则表达式选择在某个字符串后以空格开头的行

时间:2018-02-18 13:28:35

标签: javascript regex

所以我试图创建一个正则表达式来替换字符串之后的行。

var code =

if('this' == 'this')
    alert('hello');
    alert('hello');

以上是变量中的代码。它来自某个地方,并没有在js文件中定义,所以请原谅我,如果我没有正确地将它定义为变量(这是我在变量中的代码示例)。

Beneath是我需要工作的正则表达式,并附有解释。但它不起作用。我无法弄清楚如何使它发挥作用。

code = code.replace /(^\s*)(if\(.*$)(\n|$)(^$1\s.*\n|$|\z)/gm, '$1$2 {$3$4\n$1}'

所以RegEx是这样的:

  1. (^\s*) - 从该行的开头,获取所有空格(通常是标签页)

  2. (if\(.*$) - 从'中获取内容,如果'声明,直到行尾

  3. (\n|$) - 获取行的结尾

  4. (^$1\s.*\n|$|\z) - 获取与if语句一致的所有行,其中包含与(^ \ s *)(由$ 1定义)相同数量的空格,加上一行更多的空白。然后选择行的末尾或变量的其余部分。

  5. '$1$2 {$3$4\n$1}' - 首先是空格($ 1)和if语句($ 2),然后是' {',比换行符($ 3),然后是下一行($ 4),然后新行+与开头相同数量的空格,然后'}' ($ 5)

    编辑:

    由于某些原因,此代码无效,并且未在if语句行之后选择。我正在尝试其他组合,我得到的最好的是在if语句之后只选择一行(不多于一行)。

    错误出现在第4节(4美元)。 问题是在if语句之后选择所有需要的内容。

    预期结果:

    if('this' == 'this') {
        alert('hello');
        alert('hello');
    }
    

1 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

(^\s+)(if\(.*)([\n]+\1(\s+.*)+)

将匹配替换为:

\1\2{\3\n\1}

<强> Click for Demo

<强>解释

  • (^\s+) - 在每行的开始处匹配1个以上的空格并将其捕获到第1组
  • (if\(.*) - 匹配if(后跟除换行符之外的任何字符的0次出现,并将整个内容存储在第2组中
  • ([\n]+\1(\s+.*)+) - 将此整体捕获为第3组。请参阅下面的说明
    • [\n]+ - 匹配1行以上的换行符。这是在if声明之后。
    • \1 - 匹配在第1组中捕获的任何内容。(达到if语句的相同缩进级别)
    • \s+ - 匹配1个以上的空格,以确保我们将1级移动到if语句的缩进(我希望有意义)
    • .* - 匹配除换行符之外的任何字符的0次出现
    • (\s+.*)+ - 上述2个子序列出现1次以上