Java Regex在字符串的两个连续出现之间搜索,第二个可能是可选的

Java Regex在字符串的两个连续出现之间搜索,第二个可能是可选的,java,regex,Java,Regex,我正在尝试在Java中设置一个正则表达式,该正则表达式适用于0到无限的输入场景。这意味着最基本的输入可能是: Heading 1 SubheadingA: SomethingX SubheadingB: SomethingY SubheadingC: SomethingZ 我想找到标题1下B子目旁边的值,即某物Y 这可能类似于以下内容,并且正则表达式与任何内容都不匹配: Heading 1 SubheadingA: SomethingX SubheadingC:

我正在尝试在Java中设置一个正则表达式,该正则表达式适用于0到无限的输入场景。这意味着最基本的输入可能是:

Heading 1
   SubheadingA: SomethingX
   SubheadingB: SomethingY
   SubheadingC: SomethingZ
我想找到标题1下B子目旁边的值,即某物Y

这可能类似于以下内容,并且正则表达式与任何内容都不匹配:

Heading 1
   SubheadingA: SomethingX
   SubheadingC: SomethingZ
或者它可能看起来像这样并返回一些东西:

Heading 1
   SubheadingA: SomethingX
   SubheadingB: SomethingY
   SubheadingC: SomethingZ

Heading 2
   SubheadingA: SomethingU
   SubheadingB: SomethingV
   SubheadingC: SomethingW
我以为我有这个正则表达式的解决方案:

Heading\s+(1).*?SubheadingB:\s+(.*?)\n.*?(Heading)?
但是,在以下情况下,仍会返回匹配项:

Heading 1
   SubheadingA: SomethingX
   SubheadingC: SomethingZ

Heading 2
   SubheadingA: SomethingU
   SubheadingB: SomethingV
   SubheadingC: SomethingW

Heading 3
   SubheadingA: SomethingR
   SubheadingB: SomethingS
   SubheadingC: SomethingT
由于发现了“品目1”,所以返回了一些V,然后是“品目2”下的“子目B”和“品目3”,这不是我想要的

这甚至可以扩展到一个更长的例子,我只需要在“标题1”和下一个出现的“标题”之间搜索特定子目及其值:

Heading -1
   SubheadingB: SomethingBB
   SubheadingC: SomethingCC

Heading 0
   SubheadingA: SomethingDD
   SubheadingB: SomethingEE
   SubheadingC: SomethingFF

Heading 1
   SubheadingA: SomethingX
   SubheadingB: SomethingY
   SubheadingC: SomethingZ

Heading 2
   SubheadingA: SomethingGG
   SubheadingB: SomethingHH

Heading 3
   SubheadingA: SomethingJJ
   SubheadingB: SomethingKK
   SubheadingC: SomethingLL
如果没有找到“标题1->副标题B->任何值”,我仍然希望它返回一些东西或什么也不返回

我可以用什么来指定标题1之后出现的标题可能出现,也可能不出现?谢谢

编辑:忘记了换行符和可选标题之间的贪婪匹配符。我使用newline是因为某些东西中可能有空格,所以正则表达式可能是从以下位置捕获的:

SubheadingB: Something Y

并且应该返回“Something Y”。

您不想跳过另一个
标题。为此,您可以通过使用负片设置两条线之间的直线,以避免开始。作为Java字符串采样,带有标志
多行
不带
DOTALL

"^Heading +(1).*(?:\\r?\\n(?! *Heading).*)*?\\r?\\n.*?SubheadingB: *(.*)"

在regex101:(非Java)上查看这些演示。

我不知道它是否适用于Java,但请尝试一下:
标题1\s+(?:(?!\bHeading\b)[\s\s])*副标题b:\h*\K.+$
完美!这正是我需要的。仍然在努力理解消极前瞻是如何工作的,以及马车返回对新线到底做了什么,但是谢谢@Pazow如果没有带可选空间量的substr
Heading
ahead,则在每个换行符后进行负前瞻检查。所以这不会跳过以
标题开始的行。如果文件未使用
CRLF
,则可以删除
\r?
。很高兴它有帮助!在这种情况下,有没有办法避免零长度匹配?例如,@Pazow-Sure,您可以要求一个
\S
(非空白)。看,啊,这太完美了!非常感谢您的帮助和教育回应!