用于匹配示例代码后字符串的正则表达式

Regex expression to match strings after example codes

您好,我正在尝试使正则表达式与我目前拥有的带有示例文本的正则表达式代码示例之后的文本相匹配。

(?<=H\d\d\d)([.*\w\W\n]+)(?=End word)

https://regex101.com/r/9SBnH9/2

Sample text
Sample text
Sample text
H319 asdkjczixuqweoiurqoiweqwrjasdkjfqwe qweiouqwroiu kjasdkj czkjxklqjwekjiouasdiiaosudou
oiuasodiucxzlkjqweoiu oqiwur H320 asdkqjwe askjdq xzc
H325 asjdhasjd zxcjh
H331+H341+H341 askdjvkjzx qweqrqwoe
End word
Sample text
Sample text

这是示例文本,我希望表达式在找到 H** 代码后开始搜索匹配项,并且仅在再次找到时才获取文本 H** 代码忽略它并获取文本并有示例使用 H**+H**+H**H**+H**,但同样的交易跳过 H 代码并仅获取文本。并搜索直到找到 End word。我已经到了它从第一个 H 代码开始的地步,但随后它得到了所有的字符串和结束词,你可以在我发送的正则表达式站点中看到它。

我应该得到这个结果:

asdkjczixuqweoiurqoiweqwrjasdkjfqwe qweiouqwroiu kjasdkj czkjxklqjwekjiouasdiiaosudou oiuasodiucxzlkjqweoiu oqiwur.asdkqjwe askjdq xzc.asjdhasjd zxcjh.askdjvkjzx qweqrqwoe

您可以匹配中间没有紧跟 H 和 3 位数字的所有字符,并在字符串开头的右侧断言 End word

(?<=H\d{3}\b)(?:(?!\+?H\d{3}\b)[\S\s])+(?=[\s\S]*\r?\nEnd word\b)

部分匹配的模式:

  • (?<=H\d{3}\b) 正后视,断言 H 和直接向左的 3 位数字。单词边界 \b 防止部分匹配
  • (?:非捕获组
    • (?!\+?H\d{3}\b)[\S\s] 匹配任何字符(包括换行符)的 1 次以上,这些字符后面没有直接跟可选的 + 然后是 H 和 3 个数字
  • )+关闭非捕获组并重复1+次
  • (?=正向前看,向右断言
    • [\s\S]*\r?\nEnd word\b 匹配字符串开头的 End word(如果 ^ 不在开头则省略)
  • ) 关闭前瞻

Regex demo

如果您也不想交叉匹配 End word,您可以将其添加到否定前瞻中:

(?<=H\d{3}\b)(?:(?!\+?H\d{3}\b|^End word\b)[\S\s])+(?=[\s\S]*\r?\nEnd word\b)

Regex demo

我会使用这个正则表达式:

(?<=H\d{3}\b)(?!\+H\d{3})\s*([\w\W]+?)\s*(?=H\d{3}\b|End word)

观看演示 ​​here

请注意 [.*\w\W\n] 是多余的 w.r.t。只是 [\w\W],因为后者匹配任何字符或不是单词字符(因此,任何字符),所以它已经包括句点、星号和换行符。