2

我正在尝试为一堂课学习正则表达式模式。我正在制作一个简单的 HTML Lexer/Parser。我知道这不是制作 Lexer/Parser 的最佳或最有效的方法,但它只是为了理解 Regex 模式。

所以我的问题是,如何创建一个模式来检查字符串是否不包含任何 HTML 标记(即<TAG>)并且不包含任何 HTML 实体(即&ENT;)?

到目前为止,这是我能想到的,但它仍然不起作用:

.+?(^(?:&[A-Za-z0-9#]+;)^(?:<.*?>))

编辑: 唯一的问题是我不能否定最终结果我需要找到一个完整的模式来完成这项任务,如果可能的话,虽然它可能不漂亮。我从来没有提到过,但它几乎应该匹配 HTML 页面中的任何简单文本。

4

2 回答 2

2

您可以使用表达式<.+?>|&.+?;搜索匹配项,然后否定结果。

  • <.+?>先说 a<然后是任何东西(一次或多次)然后是 a>
  • &.+?;先说 a&然后是任何东西(一次或多次)然后是 a;

这是一个带有ideone.com 演示的完整示例。

import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        String[] tests = { "hello", "hello <b>world</b>!", "Hello&nbsp;world" };
        Pattern p = Pattern.compile("<.+?>|&.+?;");
        for (String test : tests) {
            Matcher m = p.matcher(test);
            if (m.find())
                System.out.printf("\"%s\" has HTML: %s%n", test, m.group());
            else
                System.out.printf("\"%s\" does have no HTML%n", test);
        }
    }
}

输出:

"hello" does have no HTML
"hello <b>world</b>!" has HTML: <b>
"Hello&nbsp;world" has HTML: &nbsp;
于 2010-12-10T20:34:19.773 回答
1

如果您要匹配不遵循模式的字符串,最简单的做法是匹配模式,然后否定测试结果。

<[^>]+>|&[^;]+;

任何与此模式匹配的字符串都将具有至少一个标记(如您所定义的那样)或实体(如您所定义的那样)。因此,您想要的字符串是与此模式不匹配的字符串(它们将没有标签或实体)。

于 2010-12-10T20:29:26.983 回答