正则表达式:匹配多行模式,直到再次出现同一行

时间:2019-04-16 11:13:23

标签: regex

我需要在以下位置匹配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 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

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

这将匹配所有文本,直到下一个散列为止(除非该散列是三个散列###的一部分)。

如果需要针对不同数量的哈希(严格优于1)修改它,则可以使用

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

答案 1 :(得分:1)

您可以使用

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

请参见a demo on regex101.com,并注意修饰符(singlelinemultilinesm)。


细分为

^\#\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
)

答案 2 :(得分:1)

您可以使用模式的第一部分来匹配第一行,然后使用负前行(?!# )来匹配以下行(如果它们不是以#开头,后跟一个空格):

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

关于图案

  • ^#字符串的开头,后跟#和空格
  • \[[^]]+\]使用否定的字符类匹配从开始到结束方括号的匹配
  • \([\d-]{10}\)\n匹配左括号,然后匹配字符类中列出内容的10倍,后跟右括号和换行符
  • (?:非捕获组
    • (?!# )负向查找,断言右边不是#和空格
    • .*(?:\n|$)匹配除换行符以外的所有字符,并匹配换行符或断言字符串的结尾
  • )*关闭非捕获组并重复0次以上

Regex demo

答案 3 :(得分:1)

最快的方法是:

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

更准确地说:

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

请参见live demo here