java - 为什么要编译 Java 正则表达式?
问题描述
我知道需要编译 Java 正则表达式才能对字符串进行任何类型的正则表达式模式匹配,但我不明白为什么需要编译它们。
正则表达式字符串编译成的更有效的表示是什么?该表示如何比字符串更有效?
解决方案
通常,正则表达式引擎使用一组指令来了解如何遍历目标文本并匹配其中的一部分。作为开发人员,我们编写的高级(人类可读)模式就像您使用 Java(或实际上任何其他语言)编写的源代码。计算机不会运行您的源代码,它会将其编译成计算机可以理解的指令。同样,您的 RegEx 模式被编译成 RegEx 引擎(无论编程语言如何)可以处理的一组指令。
我个人认为Regular-Expressions.info 网站对很多解释很有帮助,尽管他们对引擎内部工作原理的解释有点浅显。这个关于 SO 的答案很不错,还有其他一些链接。
如果您想要更深入的答案,我会查看此页面,该页面讨论了正则表达式引擎的性质,即它们是有限状态机。
正则表达式引擎被实现为有限状态机 (FSM)。你提供的模式被编译成一个代表这个状态机的数据结构。
当您将字符串与此模式匹配时,正则表达式引擎会获取每个字符并决定 FSM 中的状态转换。如果输入字符没有有效的状态转换,则匹配失败。
FSM 中的状态之一是终止/结束状态。如果正则表达式引擎到达那里,它会报告成功。
要回答您的“这比字符串更有效”的问题,它不能是字符串……您必须获取引擎的低级指令。String 类型不是一组指令!
推荐阅读
- sql - oracle sql中选择具有不同值的列的方法
- react-native - 可触摸的不透明度事件处理停止在高程上工作
- typescript - 如何解决打字稿中隐含的任何类型以索引类型错误?
- mrtk - 如何调试 MRTK UWP IL2CPP?
- angular - 输入后无法在另一个子组件上更新子组件数据
- javascript - 样条图中一个类别中的多个数据
- sql - Spark SQL中PIVOT操作的时间和空间复杂度是多少?
- couchbase - Couchbase 超时但未登录系统:completed_requests
- mysql - 如何为多个子查询赋予特定值?
- c# - 如何在依赖属性的 PropertyChangedCallback 中绑定异步方法?