使Perl风格的正则表达式解释器表现得像基本或扩展的正则表达式解释器

时间:2008-10-22 20:56:10

标签: java regex grep

我正在编写一个工具来帮助学生学习正则表达式。我可能会用Java编写它。

这个想法是这样的:学生输入正则表达式,工具显示正则表达式匹配文本的哪些部分。很简单。

但我想支持几种不同的正则表达式“风格”,例如:

  • 基本正则表达式(想想:grep)
  • 扩展正则表达式(想想:egrep)
  • Perl正则表达式的子集,包括字符类\ w,\ s等
  • Sed风格的正则表达式

Java具有java.util.Regex类,但它仅支持Perl样式的正则表达式,它是基本和扩展RE的超集。我认为我需要的是一种方法来获取任何给定的正则表达式并转义不属于给定风格的元字符。然后我可以将它提供给Regex对象,它就像是为所选的RE解释器编写的那样。

例如,给出以下正则表达式:

^\w+[0-9]{5}-(\d{4})?$

作为基本正则表达式,它将被解释为:

^\\w\+[0-9]\{5\}-\(\\d\{4\}\)\?$

作为扩展正则表达式,它将是:

^\\w+[0-9]{5}-(\\d{4})?$

作为Perl风格的正则表达式,它与原始表达式相同。

是否存在“正则表达式的正则表达式”,而不是通过正则表达式搜索和替换来引用非元字符?我还能做什么?是否有我可以使用的替代Java类?

5 个答案:

答案 0 :(得分:1)

或者,您可以使用Jakarta ORO

这支持以下正则表达式'flavors':

  • Perl5兼容的正则表达式
  • 类似AWK的正则表达式
  • glob expressions

答案 1 :(得分:1)

查看此帖子,了解“正则表达式的正则表达式”:Is there a regular expression to detect a valid regular expression?

您可以将此作为模块的基础。

答案 2 :(得分:1)

我写了类似的东西:Is there a regular expression to detect a valid regular expression?

您可以参与该表达式,并分别匹配每个标记:

[^?+*{}()[\]\\]                # literal characters
\\[A-Za-z]                     # Character classes
\\\d+                          # Back references
\\\W                           # Escaped characters
\[\^?(?:\\.|[^\\])+?\]         # Character classs
\((?:\?[:=!>]|\?<[=!])?        # Beginning of a group
\)                             # End of a group
(?:[?+*]|\{\d+(?:,\d*)?\})\??  # Repetition
\|                             # Alternation

对于每场比赛,您可以在目标口味中添加一些适当替换词典。

答案 3 :(得分:1)

如果您的目标是Unix / Linux系统,为什么只是向每个正则表达式的最终主机发出声明?即,使用grep进行BRE,egrep进行ERE,使用perl进行PCRE等?您的模块唯一需要做的就是UI。我见过的大多数正则表达式测试者(这些都是不错的)使用了这种方法的变体。

如果您还想要另一个库建议,请查看TRE以获取BRE / ERE / POSIX / AWK部分。它不支持反向引用,因此PCRE / Python / Ruby / JS / Java出来了......

答案 4 :(得分:0)

如果您希望学生学习正则表达式,为什么不在网上使用免费提供的工具 - 正则表达式教练 - http://www.weitz.de/regex-coach/,这对学习和评估正则表达式非常有用?

在类似问题上查看此SO主题 - https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world

BR,
〜A