正则表达式-连接多行而不以破折号开头

时间:2019-06-14 18:53:39

标签: regex pcre regex-lookarounds regex-negation

我有几行看起来像这样:

- test 1
  test test test
  test test test
  test test test
- test2
- test3
  test test t
  test test test
- test 4
  test test test
- test5

我正在寻找一个正则表达式将其转换为:

- test 1
  test test test test test test test test test
- test2
- test3
  test test t test test test
- test 4
  test test test
- test5

这将删除所有不以\s*?\-开头且不以\s*?\-开头的行之后的所有新行

3 个答案:

答案 0 :(得分:3)

您可以在Perl / PCRE / Java等中使用此正则表达式:

搜索正则表达式:

(^-[^\n]*\n\h+|(?!^)\G)([^\n]*)\n(?!-)\h+

替换:

"$1$2 "

RegEx Demo

RegEx详细信息:

  • (^-[^\n]*\n\h+|(?!^)\G):组#1捕获以-开头的行,直到行尾字符在下一行跟随1+空格。 \G在上一场比赛的末尾或首场比赛的字符串开头声明位置。
  • ([^\n]*):匹配0或更多非换行字符的行。在#2组中捕获
  • \n(?!-):如果不跟-
  • 则匹配换行符
  • \h+:匹配1个以上水平空格

答案 1 :(得分:3)

类似的东西

^(\h*[^-\s].*)\R(?!-)

并替换为$1

  • ^匹配行首
  • (\h*[^-\s].*)首先group捕获:任意数量的h空间,后跟一个字符,即not -\s空格,后跟任意任何字符的数量
  • \R(?!-)换行符序列,是not followed by连字符

See this demo at regex101

仅用一个空格see this version连接零件并用$1 替换(效率较低)。

答案 2 :(得分:0)

perl -ne 'if(/^-/){if($buffer){print" $buffer";print"\n"if/^-/}print;$buffer=""}else{chomp;$buffer.=s/^ +/ /r}END{print" $buffer\n"if$buffer}'

或更可读

perl -ne 'if (/^-/) {
              if ($buffer) {
                  print " $buffer";
                  print "\n" if /^-/;
              }
              print;
              $buffer = "";
          } else {
              chomp;
              $buffer .= s/^ +/ /r;
          }
          END { print " $buffer\n" if $buffer }'