gpt4 book ai didi

java - 如何使用正则表达式在 LaTeX 中查找嵌套标签

转载 作者:行者123 更新时间:2023-12-01 10:58:32 26 4
gpt4 key购买 nike

我正在尝试使用 java 从 LaTeX 源中提取定理。我的代码几乎可以工作,但一个测试用例失败了——嵌套定理。

@Test
public void testNestedTheorems() {
String source = "\\begin{theorem}" +
"this is the outer theorem" +
"\\begin{theorem}" +
"this is the inner theorem" +
"\\end{theorem}" +
"\\end{theorem}";

LatexTheoremProofExtractor extractor = new LatexTheoremProofExtractor(source);
extractor.parse();

ArrayList<String> theorems = extractor.getTheorems();
assertNotNull(theorems);
assertEquals(2, theorems.size()); // theorems.size() is 1
assertEquals("this is the outer theorem", theorems.get(0));
assertEquals("this is the inner theorem", theorems.get(1));
}

这是我的定理提取器,由 LatexTheoremProofExtractor#parse 调用:

private void extractTheorems() {

// If this has been called before, return
if(theorems != null) {
return;
}

theorems = new ArrayList<String>();

final Matcher matcher = THEOREM_REGEX.matcher(source);

// Add trimmed matches while you can find them
while (matcher.find()) {
theorems.add(matcher.group(1).trim());
}
}

THEOREM_REGEX定义如下:

private static final Pattern THEOREM_REGEX = Pattern.compile(Pattern.quote("\\begin{theorem}")
+ "(.+?)" + Pattern.quote("\\end{theorem}"));

有人对处理嵌套标签有建议吗?

最佳答案

如果您只想匹配双重嵌套的定理,您可以为它写下一个显式的正则表达式。我想它看起来会是这样的。

Pattern.compile(
Pattern.quote("\\begin{theorem}")
+ "("
+ "(.+?)"
+ Pattern.quote("\\begin{theorem}")
+ "(.+?)"
+ Pattern.quote("\\end{theorem}")
+ ")*"
+ Pattern.quote("\\end{theorem}"));

(这段代码应该给你一个想法,但它未经测试,可能无法像编写的那样工作。这不是我想要说的重点。)

您可以继续此操作进行三重嵌套,依此类推,获得您想要的任何固定数量的嵌套。不用说,很快就会变得相当尴尬。

但是,如果您的目标是匹配任意深层嵌套,那么使用正则表达式就根本不可能。问题是您要匹配的语言不是常规的(而是上下文无关的)。上下文无关语言严格来说比常规语言更强大,并且正则表达式只能精确匹配常规语言。一般来说,如果你想匹配上下文无关语言,你需要构造一个下推自动机。

进一步阅读:

关于java - 如何使用正则表达式在 LaTeX 中查找嵌套标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33468255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com