如何消除正则表达式中的冗余?
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_CHAR
和 END_CHAR
是两个不同的常量字符。在我上面的正则表达式中,START_CHAR
重复(四次)。
如何用单个START_CHAR
和END_CHAR
重写它?
【问题讨论】:
您已将其标记为 Java,但您的代码看起来像是在使用 SQL 样式的字符串连接。您的标题谈到“优化”正则表达式,但您的身体提出了完全不同的要求,希望消除对变量的多余提及。请改进您的帖子,以便清楚您的实际正则表达式是什么,它实际上是什么类型的正则表达式,以及您真正希望看到的更改。 @ruakh 感谢您向我反馈我犯的那个大错误。现在我编辑我的问题 【参考方案1】:你不需要。正则表达式被编译为 NFA 和可能已经压缩所有重复的 DFA。保持清晰,保持简单,让计算机完成繁重的工作。
【讨论】:
是的,编译器做到了。但我的正则表达式不清楚重复字符。 所以澄清它,但不要将它与“优化”混淆。没有任何区别。以上是关于如何消除正则表达式中的冗余?的主要内容,如果未能解决你的问题,请参考以下文章