有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于提取几个<div>标记的java正则表达式

以下是输入字符串:

<div class="matchthis">Orange</div>
<div class="dontmatch">One</div>
<div class="matchthis" id="hurdle">Lemon</div>
<div class="dontmatch">Two</div>
<div id="hurdle" class="matchthis">Peach</div>

我想在下面输出(包含class="matchthis"的所有<div>标记)

<div class="matchthis">Orange</div>
<div class="matchthis" id="hurdle">Lemon</div>
<div id="hurdle" class="matchthis">Peach</div>

这个Java正则表达式将只输出以下内容:

<div class="matchthis">Orange</div>

请帮助改进正则表达式以获得所需的输出

请不要告诉我使用较慢的DOM/Soup/等。我想知道raw regex能否解决上述简单问题(你将获得答案!)。是的,我知道this post,所以别提了


共 (3) 个答案

  1. # 1 楼答案

    如果标记不能嵌套,这是可能的

    您可以将(?:\s+\w+=(?:"[^"]*"|'[^']*'|\S*))*添加到属性的两侧

    不要认为这比一个好的解析器更快

  2. # 2 楼答案

    Pattern.compile(
       "<div class=\"matchthis\"(?:[^>\"']|\"[^\"]*\"|'[^']*')*>(.*?)(?=</div>)",
       Pattern.CASE_INSENSITIVE | Pattern.DOTALL)
    

    要分解它

     (?:[^>\"']|\"[^\"]*\"|'[^']*')*
    

    由于

     (?: ... )*
    

    由于

    [^>\"']
    

    或双引号属性值

    \"[^\"]*\"
    

    或单引号属性值

    '[^']*'
    

    Pattern.DOTALL意味着.*?将允许在div正文中使用换行符

    Pattern.CASE_INSENSITIVE使它能够正确地处理HTML元素名称的大小写折叠,不过如果您的默认语言环境是土耳其语,那么<DİV>可能会有一些奇怪的地方(请注意虚线I)

  3. # 3 楼答案

    <div [^>]*class=\"matchthis\"[^>]*>(.*?)(?=</div>)