我想从 HTML 中提取两个数字 10 和 11,看起来与此类似,只是它的噪声比我在这里显示的还要多:
<div a>
<noise=53>
<item=10>
<item=11>
</div>
<div b>
<item=20>
<noise=52>
<item=21>
</div>
我已经想出了如何使用两个正则表达式来做到这一点:首先使用
(?s)(?<=<div a>).*?(?=</div>)
要获取“div a”部分中的内容,然后使用
(?s)(?<=<item=)[0-9]*
在结果上得到我想要的数字。但我无法弄清楚如何只用一个正则表达式来做到这一点。我猜想如果只有 Java 让我把 *s 放在 lookbehinds 中我会怎么做,但 Java 没有(我隐约明白为什么不这样做)。是否可以仅使用一个正则表达式来执行此操作,还是我应该接受两个?
最佳答案
我不完全确定嵌套正则表达式是什么意思。通常处理这类事情的方法是像词法分析器一样,小心翼翼地一次只完成一点。这样您就不必尝试将所有内容构建到一个模式中。
您可以使用 Matcher.lookingat()
,而不是使用 Matcher.matches()
,它会从当前起点开始查找内容。这样你就可以从同一个位置测试一堆。
类似的策略涉及使用 Matcher.find()
的单参数形式,您可以在其中提供起始字符位置作为参数。
一个相关的特性是 \G
anchor ,这是一个零宽度断言,它使搜索从同一字符串的最后一个匹配项停止的地方开始。这样可以为您节省一些簿记工作。
通过明智地结合使用 find(N)
和 lookingat()
方法(加上 start()
),也许与 \G
断言,您可以自己构建一个比单独使用单个正则表达式更灵活、更复杂的处理算法。
与尝试在一个庞大的正则表达式中完成所有事情相比,使用结构逻辑和常规 Java 管理正则表达式确实要容易得多。以这种方式进行开发、调试和单元测试也容易得多。正则表达式最擅长处理字符串片段,而不是试图在其中编码整个解析算法。
此外,在 Java 中你不能真正做到这一点,因为在模式中不支持递归。也许它也一样,因为它鼓励您将控制结构放在外部语言中,因为您不能总是将您需要的所有内容都放在内部语言中。
关于java - 嵌套正则表达式是否有必要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372524/