我有几行看起来像这样:
- 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*?\-
开头的行之后的所有新行
答案 0 :(得分:3)
您可以在Perl / PCRE / Java等中使用此正则表达式:
搜索正则表达式:
(^-[^\n]*\n\h+|(?!^)\G)([^\n]*)\n(?!-)\h+
替换:
"$1$2 "
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 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 }'