为什么要编译Java正则表达式?

joh*_*ell 2 java regex string performance compilation

我了解需要对Java正则表达式进行编译才能对字符串执行任何类型的正则表达式模式匹配,但是我不明白为什么需要对其进行编译。

正则表达式字符串被编译成的更有效的表示是什么?以及这种表示比字符串更有效吗?

jak*_*lla 5

通常,正则表达式引擎使用一组指令来了解如何遍历目标文本并匹配目标文本的部分。作为开发人员,我们编写的高级(人类可读)模式就像您的Java(或其他任何语言)源代码一样。计算机没有运行您的源代码,而是将其编译为计算机可以理解的指令。同样,您的RegEx模式被编译为RegEx引擎(无论哪种编程语言)都可以处理的一组指令。

我个人认为Regular-Expressions.info网站对很多解释很有帮助,尽管他们对引擎内部工作原理的解释有些浅。SO的这个答案很不错,还有其他一些链接。

如果您想获得更深入的答案,我将在此页面上讨论正则表达式引擎的本质,即正则表达式引擎是有限状态机

正则表达式引擎被实现为有限状态机(FSM)。您提供的模式被编译成表示该状态机的数据结构。

当您将字符串与此模式匹配时,正则表达式引擎将获取每个字符并确定FSM中的状态转换。如果输入字符没有有效的状态转换,则匹配失败。

FSM中的状态之一是终止/结束状态。如果正则表达式引擎到达那里,它将报告成功。

要回答“如何比字符串更有效”的问题,它不能是字符串...您必须获取引擎的低级指令。字符串类型不是指令集!