正则表达式在管道分隔的字符串中查找两个字符串

Regex to find two strings within a pipe delimited string

如果管道之间出现以下两个词,我需要在定界字符串中找到匹配项:applered

示例字符串 1(应该匹配):

|big blueberries blue|awesome lemon yellow|apple nice delicious red|

示例字符串 2(不应匹配):

|big blueberries apple|awesome lemon yellow|nice delicious red|

RegEx 尝试过:

^.*?apple.*?red.*?

哪种(有点)有效,但不确定如何包含管道逻辑,即在管道之间搜索。

如果管道之间需要出现“苹果”和“红色”,请使用:

^.*?apple[^|]*red.*?

解释:强制“apple”和“red”之间的任何字符都不是管道符号|。也可以去掉贪心匹配?,然后.

regex101...

亲自看看

如果该顺序中的 2 个单词必须在 2 个管道之间:

^[^|\r\n]*\|.*?\bapple\b[^|\r\n]*\bred\b[^|\r\n]*\|.*
  • ^ 字符串开头
  • [^|\r\n]*\| 匹配除 | 以外的任何字符或换行符,然后匹配 |
  • .*?尽可能少的匹配
  • \bapple\b 匹配单词 apple
  • [^|\r\n]* 匹配 | 或换行符
  • 以外的可选字符
  • \bred\b匹配红色这个词
  • [^|\r\n]*\| 匹配除 | 以外的任何字符或换行符,然后匹配 |
  • .* 匹配行的其余部分

.NET Regex demo

如果顺序无关紧要,您可以对 apple 或 red 使用捕获组,然后再次匹配同一个词,断言它使用的是否定查找头和尚未匹配的反向引用:

^[^|\r\n]*\|.*?\b(apple|red)\b[^|\r\n]*\b(?!)(?:apple|red)\b[^|\r\n]*\|.*

再看一个.NET regex demo