我有一个具体的模式:
\A
(%\s*!\s*T[eE]X program=(?<programMagic>[^} ]+)\R)?
(\\(documentstyle|documentclass)\s*(\[[^]]*\])?\s*\{(?<docClass>[^} ]+)\})?
我想匹配以下字符串
% !TEX program=lualatex
\documentclass[a4paper,12pt]{book}
正如人们所看到的,它是关于匹配乳胶根文件的开头 并提取程序和文档类。
\A
是限制在文件的开头
模式的最后两行是可选的,但很贪婪(运算符?
)。
这不是全部事实,但我想识别根文件
当提供课程或课程时。
如果我删除两个
?
,则给定的文件匹配
并且程序和类都被正确识别。
如果我像上面一样添加两个
?
,那么只有第二个,类是匹配的。
如果我仅使用一个 ?
,则仅匹配另一个非可选部分。
如果我正确理解了正则表达式的理论, 那么
?
是贪婪的,所以类和程序都必须匹配
在上面的模式版本中。
事实并非如此。 这是一个错误还是我误解了什么?
我想在给出类或程序时识别根文件。
您可以交替使用此正则表达式:
\A(?:%\s*!\s*T[eE]X program=(?<programMagic>[^} ]+)\R|(?:.*\R)?\\(documentstyle|documentclass)\s*\[[^]]*]\s*\{(?<docClass>[^} ]+)})
请注意,几乎所有正则表达式模式都在这里使用,但我们使用它的方式如下:
\A(?:patternLine1\R|(?:\R)?patternLine2)