スペース、タブ、および新しい行を削除するための次の正規表現があります。[^ \n\t]
>
ただし、やなどの特定の追加文字については、これを拡張したいと思い<
ます。
を試し[^ \n\t<>]
ましたが、これは今のところうまく機能しますが、<
またはの>
前に。が付いている場合、式が一致しないようにし\
ます。
試し[^ \n\t[^\\]<[^\\]>]
ましたが、うまくいきませんでした。
以下のシーケンスのいずれかが入力に発生する可能性がありますか?
\\>
\\\>
\\\\>
\
blank
\
tab
\
newline
...
もしそうなら、あなたはそれらをどのように扱うことを提案しますか?
そうでない場合は、正規表現エンジンがサポートしていれば、ゼロ幅の後読みアサーションでうまくいきます。これは、Perl スタイルの正規表現 (Perl や PHP などを含む) をサポートするすべてのエンジンに当てはまります。
(?<!\\)[ \n\t<>]
上記は、エスケープされていないスペース、改行、タブ、または角括弧に一致します。より一般的に (を\s
含む空白文字を示すために使用\r
):
(?<!\\)\s
あるいは、ゼロ幅の後読みアサーションを必要とせずに補完的な表記法を使用します (ただし、おそらく効率は低くなります)。
(?:[^ \n\t<>]|\\[<>])
後者のバリエーションを使用して\\>
、\\\>
、\\\\>
などのケースを処理することもできます。また、次のように、前にある有限数のバックスラッシュまで使用できます。
(?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
grep manページによると:
ブラケット式は、[ と ] で囲まれた文字のリストです。そのリスト内の任意の 1 文字に一致します。リストの最初の文字がキャレット ^ の場合、リストにない任意の文字に一致します。
これは、\< や \> などの一連の文字を 1 文字だけに一致させることはできないことを意味します。
Perl 正規表現をサポートするようにビルドされた grep のバージョンを持っていない限り、言及されている他のポスターの 1 つのようなルックアラウンドを使用できます。ただし、grep のすべてのバージョンがこのサポートを持っているわけではありません。
egrepを使用して、パターン文字列を引用符で囲むことができます。これにより、エスケープする必要がなくなります。