如何消除正则表达式中的冗余?

Posted

技术标签:

【中文标题】如何消除正则表达式中的冗余?【英文标题】:How to eliminate redundant in the regular expression? 【发布时间】:2014-05-05 06:10:18 【问题描述】:

我在 PL/SQL 中编写了一个正则表达式来验证自定义 URL:

'^((http|https):\/\/)?(www[0-9]\.)?(([A-Za-z0-9_-])+\.1)+([A-Za-z]2,4|\'
|| START_CHAR || '[^' || START_CHAR || END_CHAR || ']+\' || END_CHAR ||
')(\/([A-Za-z0-9_-]|\' || START_CHAR || '[^' || START_CHAR || END_CHAR ||
']+\' || END_CHAR || ')+)*(\/)?$'

START_CHAREND_CHAR 是两个不同的常量字符。在我上面的正则表达式中,START_CHAR 重复(四次)。

如何用单个START_CHAREND_CHAR 重写它?

【问题讨论】:

您已将其标记为 Java,但您的代码看起来像是在使用 SQL 样式的字符串连接。您的标题谈到“优化”正则表达式,但您的身体提出了完全不同的要求,希望消除对变量的多余提及。请改进您的帖子,以便清楚您的实际正则表达式是什么,它实际上是什么类型的正则表达式,以及您真正希望看到的更改。 @ruakh 感谢您向我反馈我犯的那个大错误。现在我编辑我的问题 【参考方案1】:

你不需要。正则表达式被编译为 NFA 和可能已经压缩所有重复的 DFA。保持清晰,保持简单,让计算机完成繁重的工作。

【讨论】:

是的,编译器做到了。但我的正则表达式不清楚重复字符。 所以澄清它,但不要将它与“优化”混淆。没有任何区别。

以上是关于如何消除正则表达式中的冗余?的主要内容,如果未能解决你的问题,请参考以下文章

SELECT 和 WHERE 中的冗余正则表达式

用于检查 Java 中的变量名以消除许多 IF-ELSE 块的正则表达式

去掉word冗余格式 java正则表达式

在 php 中使用正则表达式进行排列

Python 正则表达式re模块

hive 正则匹配符号都要转义吗