Форматирование текста в возвышенном с использованием регулярных выражений - PullRequest
1 голос
/ 14 марта 2019

Я хочу отформатировать мой файл, содержащий ключевые слова, отсортированные по алфавиту, что-то вроде этого:

...
national day
national
other
random
random2
...

, и я хочу поставить пробел между ключевыми словами, начинающимися с разных алфавитов (то есть пробел между a и b ии так далее), который будет выглядеть примерно так:

...
national day
national

other

random
random2
...

Я делаю это с помощью регулярного выражения, и я попробовал регулярное выражение \n(.{1,1})(?:.*?)\n(?!\1).Это прекрасно работает для большинства случаев, за исключением случаев, когда есть только одно вхождение ключевого слова из одного алфавита, в данном случае other. Ссылка на регулярное выражение .

Как видно, national и random2 совпадают, но other нет, хотя я считаю, что для этого есть все основания.

Используемое регулярное выражение ^(.{1,1})(?:.*?)\n(?!\1) (первое \n заменено на ^), но мне нужна причина, по которой первое регулярное выражение не соответствует other.Спасибо.

1 Ответ

1 голос
/ 14 марта 2019

Ваше регулярное выражение использует обе строки до и после этой строки. На демонстрации ниже обратите внимание, как двигатель пропускает строку other:

enter image description here

Вы можете исправить шаблон с другим взглядом, (?<=\n) положительный взгляд сзади: (?<=\n)(.).*\n(?!\1), см. демо .

Однако вы можете использовать более «линейный» шаблон без обходных путей:

^(.).*(?:\n\1.*)*

Или, если поддерживается \R:

^(.).*(?:\R\1.*)*

Заменить на $0\n. См. regex demo .

подробности

  • ^ - начало строки
  • (.) - Группа захвата 1: любой символ, кроме символа разрыва строки
  • .* - остаток строки
  • (?:\n\1.*)* - ноль или более повторений
    • \n - новая строка
    • \1 - тот же символ, что и в группе 1
    • .* - остаток строки.

Замените \n на \R, чтобы соответствовать любой последовательности разрыва строки.

...