Regexp - объединение нескольких строк, не начинающихся с тире - PullRequest
1 голос
/ 14 июня 2019

У меня есть строки, которые выглядят так:

- 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 ]

3 голосов
/ 14 июня 2019

Как насчет чего-то вроде

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

и заменить на $1

  • ^ соответствует началу строки
  • (\h*[^-\s].*) первый группа захватывает: Любое количество h-пробела, за которым следует символ, то есть , а не - или \s пробел, за которым следует любое количество любые символы
  • \R(?!-) последовательность новой строки, за которой не следует дефис

См. Эту демонстрацию на regex101

Для соединения деталей одним пробелом см. Эту версию и заменить на $1 (чуть менее эффективно).

3 голосов
/ 14 июня 2019

Вы можете использовать это регулярное выражение в 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+ горизонтальные пробелы
0 голосов
/ 14 июня 2019
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 }'
...