正则表达式匹配多个paterns句子

时间:2018-01-03 17:39:09

标签: regex

我希望在重要部分中获取所有非重要名称的所有名称

我的文字:

*** not important
name 1
    details
name 2
    details
*** important
name 3
    details
name 4
    details

我想要的是什么:

name 3
name 4

到目前为止我所拥有的:

这匹配所有名称

(^[^ ].*$)

但是当我试图只获得重要的那个时它会失败

\*\*\* important[\s\S]*(^[^ ].*$)

或者

\*\*\* important[\s\S]*?(^[^ ].*$)

这里的例子: https://regex101.com/r/SdG28O/2

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

代码

See regex in use here

q    t    q'    t'    d
-----------------------
q0   a    q1    #     right    // erase two a's from
q1   a    q2    #     right    // the front of the tape

q2   a    q2    a     right    // scan to the end
q2   b    q2    b     right    // of the tape
q2   #    q3    #     left

q3   b    q4    #     left     // erase two b's from
q4   b    q5    #     left     // the end of the tape

q5   a    q5    a     left     // scan to the beginning
q5   b    q5    b     left     // of the tape
q5   #    q6    #     right

q6   a    q1    a     right    // try to start erasing a's
q6   #    hA    #     -        // or halt if all input is erased

可替换地:

(?:^\*{3} important$|\G(?!\A))[\s\S]*?\K^[^ ].*

结果

输入

(?:^\*{3} important$|\G(?!\A))[\s\S]*?\K^\S.*

输出

*** not important
name 1
    details
name 2
    details
*** important
name 3
    details
name 4
    details

说明

  • name 3 name 4 匹配以下任一项
    • (?:^\*{3} important$|\G(?!\A))符合以下条件
      • ^\*{3} important$在行首处断言位置
      • ^完全匹配\*{3} 3次
      • *匹配文字空格字符
      • 按字面意思匹配
      • important断言行尾的位置
    • $在上一场比赛结束时断言位置
  • \G(?!\A)任意次数匹配任何字符,但尽可能少
  • [\s\S]*?重置比赛的起点。最终匹配中不再包含任何以前消费的字符
  • \K在行首处断言位置
  • ^匹配任何非空格字符:You can replace this with \S instead (for any non-whitespace character) if you prefer
  • [^ ]多次匹配任何字符