Java Regex在字符串的两个连续出现之间搜索,第二个可能是可选的
我正在尝试在Java中设置一个正则表达式,该正则表达式适用于0到无限的输入场景。这意味着最基本的输入可能是:Java Regex在字符串的两个连续出现之间搜索,第二个可能是可选的,java,regex,Java,Regex,我正在尝试在Java中设置一个正则表达式,该正则表达式适用于0到无限的输入场景。这意味着最基本的输入可能是: Heading 1 SubheadingA: SomethingX SubheadingB: SomethingY SubheadingC: SomethingZ 我想找到标题1下B子目旁边的值,即某物Y 这可能类似于以下内容,并且正则表达式与任何内容都不匹配: Heading 1 SubheadingA: SomethingX SubheadingC:
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如果没有带可选空间量的substrHeading
ahead,则在每个换行符后进行负前瞻检查。所以这不会跳过以标题开始的行。如果文件未使用CRLF
,则可以删除\r?
。很高兴它有帮助!在这种情况下,有没有办法避免零长度匹配?例如,@Pazow-Sure,您可以要求一个\S
(非空白)。看,啊,这太完美了!非常感谢您的帮助和教育回应!