9

スペース、タブ、および新しい行を削除するための次の正規表現があります。[^ \n\t]

>ただし、やなどの特定の追加文字については、これを拡張したいと思い<ます。

を試し[^ \n\t<>]ましたが、これは今のところうまく機能しますが、<またはの>前に。が付いている場合、式が一致しないようにし\ます。

試し[^ \n\t[^\\]<[^\\]>]ましたが、うまくいきませんでした。

4

3 に答える 3

4

以下のシーケンスのいずれかが入力に発生する可能性がありますか?

\\>
\\\>
\\\\>
\blank
\tab
\newline
...

もしそうなら、あなたはそれらをどのように扱うことを提案しますか?

そうでない場合は、正規表現エンジンがサポートしていれば、ゼロ幅の後読みアサーションでうまくいきます。これは、Perl スタイルの正規表現 (Perl や PHP などを含む) をサポートするすべてのエンジンに当てはまります。

 (?<!\\)[ \n\t<>]

上記は、エスケープされていないスペース、改行、タブ、または角括弧に一致します。より一般的に (を\s含む空白文字を示すために使用\r):

 (?<!\\)\s

あるいは、ゼロ幅の後読みアサーションを必要とせずに補完的な表記法を使用します (ただし、おそらく効率は低くなります)。

 (?:[^ \n\t<>]|\\[<>])

後者のバリエーションを使用して\\>\\\>\\\\>などのケースを処理することもできます。また、次のように、前にある有限数のバックスラッシュまで使用できます。

 (?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>])
于 2009-03-25T20:49:04.910 に答える
0

grep manページによると:

ブラケット式は、[ と ] で囲まれた文字のリストです。そのリスト内の任意の 1 文字に一致します。リストの最初の文字がキャレット ^ の場合、リストにない任意の文字に一致します。

これは、\< や \> などの一連の文字を 1 文字だけに一致させることはできないことを意味します。

Perl 正規表現をサポートするようにビルドされた grep のバージョンを持っていない限り、言及されている他のポスターの 1 つのようなルックアラウンドを使用できます。ただし、grep のすべてのバージョンがこのサポートを持っているわけではありません。

于 2009-03-25T20:50:54.047 に答える
-1

egrepを使用して、パターン文字列を引用符で囲むことができます。これにより、エスケープする必要がなくなります。

于 2009-03-25T19:18:26.610 に答える