1

I am writing a tool to help students learn regular expressions. I will probably be writing it in Java.

The idea is this: the student types in a regular expression and the tool shows which parts of a text will get matched by the regex. Simple enough.

But I want to support several different regex "flavors" such as:

  • Basic regular expressions (think: grep)
  • Extended regular expressions (think: egrep)
  • A subset of Perl regular expressions, including the character classes \w, \s, etc.
  • Sed-style regular expressions

Java has the java.util.Regex class, but it supports only Perl-style regular expressions, which is a superset of the basic and extended REs. What I think I need is a way to take any given regular expression and escape the meta-characters that aren't part of a given flavor. Then I could give it to the Regex object and it would behave as if it was written for the selected RE interpreter.

For example, given the following regex:

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

As a basic regular expression, it would be interpreted as:

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

As an extended regular expression, it would be:

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

And as a Perl-style regex, it would be the same as the original expression.

Is there a "regular expression for regular expressions" than I could run through a regex search-and-replace to quote the non-meta characters? What else could I do? Are there alternative Java classes I could use?

4

5 に答える 5

1

私は似たようなことを書いています:有効な正規表現を検出するための正規表現はありますか?

その式の一部を取り、各トークンを個別に照合できます。

[^?+*{}()[\]\\]                # 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

一致ごとに、ターゲット フレーバーの適切な置換の辞書を持つことができます。

于 2008-10-22T21:31:53.377 に答える
1

ターゲットが Unix/Linux システムの場合、各正規表現の最終的なホストにシェルアウトする必要はありません。つまり、BRE には grep、ERE には egrep、PCRE には perl などを使用しますか? モジュールが行う必要があるのは UI だけです。私が見た (まともな) 正規表現テスターのほとんどは、このアプローチの変形を使用しています。

さらに別のライブラリの提案が必要な場合は、BRE / ERE / POSIX / AWK 部分のTREを参照してください。後方参照に対応していないので、PCRE/Python/Ruby/JS/Javaはアウト...

于 2010-05-13T17:15:02.360 に答える
1

または、 Jakarta OROを使用できますか?

これは、次の正規表現の「フレーバー」をサポートしています。

  • Perl5 互換の正規表現
  • AWK のような正規表現
  • グロブ式
于 2008-10-22T21:01:58.040 に答える
1

「正規表現の正規表現」については、この投稿を確認してください:有効な正規表現を検出するための正規表現はありますか?

これをモジュールの基礎として使用できます。

于 2008-10-22T21:20:04.290 に答える
0

生徒に正規表現を学習させたい場合は、ネット上で無料で入手できるツール (正規表現コーチ) を使用してみません?

同様の問題に関するこのSOスレッドを見てください - https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world

BR、
~A

于 2008-10-22T21:56:32.377 に答える