すべての正規表現フレーバーに共通の機能はありますか?
-
09-06-2019 - |
質問
私は、さまざまな正規表現対応ツール/言語 (例:perl、sed、java、vim など) ですが、多くの違いもあります。
ありますか 標準 すべての正規表現対応ツール/言語がサポートする正規表現機能のサブセット?正規表現の機能はツール/言語によってどのように異なりますか?
解決
正規表現のフレーバーを比較する
他のヒント
ほとんどの正規表現ツール/言語はこれらをサポートしています 基本的な能力:
- 文字クラス/セットとその否定 - []
- アンカー - ^$
- 代替 - |
- 量指定子 - ?+*{n,m}
- メタキャラクター - \w、\s、\d、...
- 後方参照 - \1、\2、...
- ドット - 。
- /g や /i などの単純な修飾子はグローバルであり、大文字と小文字は区別されません。
- エスケープ文字
より高度なツール/言語のサポート:
- 先読みと後読み
- POSIX 文字クラス
- 単語の境界
- インラインスイッチは、正規表現の一部のみで大文字と小文字を区別しないようにします。
- 追加の書式設定とコメントを許可する /x のような修飾子、複数行の /m など
- 名前付きキャプチャ
- ユニコード
egrep や sed 正規表現文法ではなく grep 正規表現文法を使用し、それを使用した場合は、多くのプラットフォームやツールにわたって安全なサブセットを使用する必要があります。
唯一問題となるのは、有限状態オートマトン (FSA) を使用した正規表現の実装と、バックトラッキングを使用した正規表現の実装を切り替えるときです。量指定子の実装は grep から Perl まで異なります。
FSA ベースの実装では、最初の可能な位置から始まる最長一致が検索されます。バックトラックするものは、最初の可能な位置から開始して、左に偏った最初の一致を見つけます。つまり、一致するものが見つかるまで、パターン内の順序で各分岐を試行します。
文字列を考えてみましょう "xyxyxyzz"
, 、そしてパターン "(xy)*(xyz)?"
. 。FSA ベースのエンジンは可能な限り長い部分文字列に一致します。 "xyxyxyz"
. 。バックトラッキングベースのエンジンは、左に偏った最初の部分文字列と一致します。 "xyxyxy"
.
標準エンジンはありません。ただし、POSIX 拡張正規表現形式はほとんどのエンジンの有効なサブセットであり、おそらく標準化されたサブセットに限りなく近いものです。
emacs の正規表現構文を参照してください。 http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.
emacs の構文は (下位互換性の理由で) 固定されていると読んだ記憶があります。 すべて, 、すべてをこれと互換性のあるものにします。一部のツールはそれをサポートしているかもしれませんが、他のツールはサポートしていないかもしれません。
価値のある目標はありますが、それを達成するのは非常に難しいと思います。また、emacs の正規表現を扱うのは面倒だと思います。おそらく、すべてのことの 99% があなたをより幸せにし、生産性を高めるのであれば十分なのではないでしょうか?