KornShellパターンは正規表現ですか?

KornShellパターンは正規表現ですか?

KornShellモードは、反復指定子(たとえば、、)と多くのクールな機能の間の否定を使用して、POSIXシェルの「glob」モード(たとえば*、など)を拡張します。?*(...)+(...)

ホビストプロジェクトでは、BRE、ERE、JavaScript RegExpなど、さまざまな正規表現バリアントではなく、文字列処理のためにこれらのパターンを実装する予定です。私の考えの最大の利点は、パターンを書くときにバックスラッシュ文字の使用を避けることができるので、C文字列ではあまり冗長ではないということです。

私のコンピュータサイエンスの限られた理解は、KornShellモードが既存の構文規則に従うことを可能にする機能をサポートすることを示唆しています。

Q:これは技術的に正しいですか? (そうでなくても、私はまだこのサブ言語が価値があり望ましいと思います。)

答え1

はい、そうです。通常の拡張正規表現をより直接的に変換するzshの拡張glob globパターンと同様に、正規表現で資格を得ることができます。

むしろ 扱いにくい クッシュ 93
. ? ?
x* x# *(x)
x+ x## +(x)
x{1,2} x(#c1,2) {1,2}(x)
[...] [...] [...]
(...) (...) @(...)
a|b (a|b) @(a|b)
^ (#s) なし1
$ (#e) なし1
x? (|x) ?(x)
\1² なし² \1

ksh93の組み込み関数は、正規表現をあるprintf方言から別の方言に変換することもできます。

$ printf '%P\n' '^(x{1,3})?a+'
?({1,3}(x))+(a)*
$ printf '%R\n' '*(x)'
^(x)*$

ast-open実装には、一致のためにksh93拡張globパターンを使用する/grepがあります。-K--ksh-regexp

しかし、私はそれでも電話するのを避けます。正規表現混乱だけを引き起こす可能性があるからです。


1 globパターンは通常デフォルトで固定されていますが、一部のコンテキストではいくつかの外部構文で固定できます(たとえば、${var/#pattern/replacement}最初に固定されたパターンと似ています)。${var/pattern/replacement}

²標準EREには逆参照がなく、一部のEREエンジンはそれを拡張としてサポートしていますが、標準BREにのみあります。とにかくzshとksh93の両方がサポートされています。捕獲部分を一致させ、後でもう一度呼び出します(コンテキストに従って$MATCHzshで/$match[1]有効にするか、ksh93で/(正確な一致)/使用可能)(#m)(#b)\0${.sh.match[0]}sed&\1${.sh.match[1]}

関連情報