java正则表达式:尽管贪婪的可选运算符没有最大匹配

问题描述 投票:0回答:1

我有一个具体的模式:

\A
(%\s*!\s*T[eE]X program=(?<programMagic>[^} ]+)\R)?
(\\(documentstyle|documentclass)\s*(\[[^]]*\])?\s*\{(?<docClass>[^} ]+)\})?

我想匹配以下字符串

% !TEX program=lualatex
\documentclass[a4paper,12pt]{book}

正如人们所看到的,它是关于匹配乳胶根文件的开头 并提取程序和文档类。

\A
是限制在文件的开头 模式的最后两行是可选的,但很贪婪(运算符
?
)。 这不是全部事实,但我想识别根文件 当提供课程或课程时。

如果我删除两个

?
,则给定的文件匹配 并且程序和类都被正确识别。

如果我像上面一样添加两个

?
,那么只有第二个,类是匹配的。 如果我仅使用一个
?
,则仅匹配另一个非可选部分。

如果我正确理解了正则表达式的理论, 那么

?
是贪婪的,所以类和程序都必须匹配 在上面的模式版本中。

事实并非如此。 这是一个错误还是我误解了什么?

java regex regex-group regex-greedy
1个回答
0
投票

我想在给出类或程序时识别根文件。

您可以交替使用此正则表达式:

\A(?:%\s*!\s*T[eE]X program=(?<programMagic>[^} ]+)\R|(?:.*\R)?\\(documentstyle|documentclass)\s*\[[^]]*]\s*\{(?<docClass>[^} ]+)})

请注意,几乎所有正则表达式模式都在这里使用,但我们使用它的方式如下:

\A(?:patternLine1\R|(?:\R)?patternLine2)

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.