【问题标题】:Make a Perl-style regex interpreter behave like a basic or extended regex interpreter使 Perl 风格的正则表达式解释器的行为类似于基本或扩展的正则表达式解释器
【发布时间】:2010-09-18 15:45:55
【问题描述】:

我正在编写一个工具来帮助学生学习正则表达式。我可能会用 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 类吗?

【问题讨论】:

    标签: java regex grep


    【解决方案1】:

    或者,您可以使用Jakarta ORO?

    这支持以下正则表达式“风味”:

    • Perl5 兼容的正则表达式
    • 类似 AWK 的正则表达式
    • 全局表达式

    【讨论】:

      【解决方案2】:

      查看这篇文章以获取“正则表达式的正则表达式”:Is there a regular expression to detect a valid regular expression?

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

      【讨论】:

        【解决方案3】:

        我写过类似的东西: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
        

        对于每场比赛,你可以有一些目标风格的适当替换字典。

        【讨论】:

          【解决方案4】:

          如果你想让你的学生学习正则表达式,为什么不使用一个免费的工具——正则表达式教练——http://www.weitz.de/regex-coach/在网上非常适合学习和评估正则表达式?

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

          BR,
          ~A

          【讨论】:

            【解决方案5】:

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

            如果您还需要其他库建议,请查看 TRE 的 BRE / ERE / POSIX / AWK 部分。它不支持反向引用,所以 PCRE / Python / Ruby / JS / Java 出局了……

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-12-31
              • 2013-01-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多