Регулярное выражение: соответствует многострочному шаблону до тех пор, пока тот же шаблон не появится снова - PullRequest
1 голос
/ 16 апреля 2019

Мне нужно сопоставить 3 части в следующем бите:

# [1.3.3] (2019-04-16)

### Blah
* Loreum ipsum

# [1.3.0] (2019-04-01)

### Foo
* Loreum ipsum

# [1.2.0] (2019-03-05)

### Foo
* Loreum ipsum

В основном первый будет

    # [1.3.3] (2019-04-16)

    ### Blah
    * Loreum ipsum

и т. Д.

Я попробовал следующее:

(# \[.*\] \([0-9\-]{10}\)(\n|.)*)

Но это в основном будет соответствовать всему документу. Мне нужно сказать ему, чтобы он прекратил сопоставление до начала новой строки с (# \[) (что будет ^(?!(# \[)).*$)

Ответы [ 4 ]

1 голос
/ 16 апреля 2019

Самый быстрый способ сделать это:

^#.*(\r?\n(?!# ).*)+

Чтобы сделать это более точным:

^# \[\d.*(?:\r?\n(?!# ).*)+

См. живая демонстрация здесь

1 голос
/ 16 апреля 2019

Вы можете использовать

^\#\s+\[.+?(?=^\#\s+\[|\Z)

См. демонстрацию на regex101.com и учитывать модификаторы (singleline и multiline, sи m).


Сломано это
^\#\s+\[     # start of the line, followed by "# ["
.+?          # everything else afterwards until ...
(?=
    ^\#\s+\[ # ... the pattern from above right at the start of a new line
    |        # or
    \Z       # the very end of the string
)
1 голос
/ 16 апреля 2019

Вы можете использовать первую часть вашего шаблона, чтобы соответствовать первой строке, а затем использовать отрицательный прогноз (?!# ), чтобы соответствовать следующим строкам, если они не начинаются с #, за которым следует пробел:

^# \[[^]]+\] \([\d-]{10}\)\n(?:(?!# ).*(?:\n|$))*

О шаблоне

  • ^# Начало строки, за которым следует # и пробел
  • \[[^]]+\] Сопоставление от открывающей до закрывающей квадратной скобки с использованием отрицательного класса символов
  • \([\d-]{10}\)\n Сопоставить открывающую скобку, затем сопоставить 10 раз с тем, что указано в классе символов, за которым следует закрывающая скобка и символ новой строки
  • (?: Группа без захвата
    • (?!# ) Отрицательный взгляд, утверждаю, что справа не #, а пробел
    • .*(?:\n|$) Соответствует любому символу кроме новой строки и соответствует либо новой строке, либо утверждению конца строки
  • )* Закрыть группу без захвата и повторить 0+ раз

Regex demo

1 голос
/ 16 апреля 2019

Вы можете использовать следующее регулярное выражение:

(# \[.*\] \([0-9\-]{10}\)(\n|[^#]|###)*)`

Это будет соответствовать любому тексту до следующего хеша (кроме случаев, если этот хеш является частью группы из трех хешей ###).

Если вам нужно изменить его для различного количества хешей (строго больше 1), вы можете использовать

(# \[.*\] \([0-9\-]{10}\)(\n|[^#]|##+)*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...