java - 嵌套正则表达式是否有必要?

标签 java regex

我想从 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/

相关文章:

Java7 WatchService : Is there a "built-in" way to Ignore OS-specific files like . DS_Store?

java - 使用 ":"运算符

regex - Vim 获取匹配行的长度

asp.net - 如何将两个正则表达式合二为一?

java - 将序言应用程序转换为基于 JVM 的语言?

java - Android 中的安全数据库存储

java - Eclipse 在某个未知位置提取可执行文件

javascript - 正则表达式全局替换不替换第一次出现的情况

python - 使用正则表达式列表按正则表达式的顺序过滤字符串列表的最Pythonic方法是什么?

java - 如何只允许三个字符