2

英数字以外のすべての文字に一致する Perl 正規表現/\W/iがありますが、無視したいスペースにも一致します。スペース以外の英数字以外の文字と一致させるにはどうすればよいですか?

4

3 に答える 3

14

あなたが使用することができます

/[^\w\s]/

これは、すべての非単語文字 (\w) および非空白文字 (\s) に一致します。

編集:

/[^\w ]/

スペースのみを無視する場合 (すべての空白ではありません)。

アップデート:

i不要なため削除されました (いくつかのコメントを参照してください)。

于 2010-10-20T00:14:55.363 に答える
8

ほとんどの場合、[^\w\s]これで十分です。これは、「alphanumunder」でも PerlSpace でもない 1 文字だけに一致します。

それは、chr 11、垂直タブに関するイタチを除いて、それ考慮されませんが、考慮されないため、それは、またはアンダースコア (LOW LINE) またはではない\p{Alphabetic}ものと一致すると言うのとほとんど同じではありません。\p{Digit}\p{WhiteSpace}\s\p{WhiteSpace}

この短い\s略記は実際には menas\p{PerlSpace}であり、 ではありません \p{WhiteSpace}。そして\p{Space}と同じ\p{WhiteSpace}です。唯一の\S文字 (つまり、 ではない\s)\p{Space}は、厄介な垂直タブです。垂直タブは に含まれていることに注意してください。つまり\v[\v\h]垂直または水平の空白の は、\p{Space}ではなくと同じ\sです。

ここで、英数字についてより正確に説明します。簡単にするために、ポジティブマッチについて話します。ロジックを反転して、否定的な一致を取得するのは簡単なはずです。

「英数字」が文字または数字のいずれかを意味する場合、おそらくそれを正確に意味するプロパティを使用する必要があります。\pLは の略で\p{Letter}、おそらくそれらをカバーしています。すべての文字はアルファベットですが、ローマ数字、丸で囲まれた文字、さまざまな分音記号など、まだアルファベットで はない文字があります。\p{Alphabetic}\p{Letter}

数字については、数字だけを含めるつもりなのか、それとも他の数字でもいいのかという質問です。 \pNは の略です\p{Number}が、これには多くの非数字が含まれます。 \dは の略で\p{Nd}、これも の略ですが\p{Decimal_Number}\p{Digit}問題なく動作します。数字以外の数字には、ローマ数字、下品な分数、上付き数字、丸数字が含まれます。

Perl 5.11 からしばらくすると、 のみ、文字のみ、および両方のプロパティを使用できるようになりました\p{POSIX_Digit}。そのリリース以降の にもあり、文字 9 ~ 13 と 32のみをカバーし、後で来る他の 20 の空白文字を完全に無視します。[0-9]\p{POSIX_Alpha}\p{POSIX_Alnum}\p{POSIX_Space}

それまでは、 を使用して一致を ASCII のみに制限する先読みアサーションを使用することで、一致を ASCII 範囲に制限することができますが、/(?=\p{ASCII})[\p{Alpha}\p{Digit}]/文字を 7 ビットに制限することは非常に過去の千年です。

私はおそらく彼らにローマ数字を使用させますが、エキゾチックな分音記号は使用させないので、/[\p{Letter}\p{Digit}]/必要に応じて短縮できる を使用します/[\pL\d]/.

\sここで、または少し幅の広いを使用してそれに空白を追加し\p{Space}、 を与え/[\p{Letter}\p{Digit}\p{Space}]/ます。あなたの言いたいことがより明確になると思うので、私もその形のままにします。

それを否定するために、接頭辞を付けることを考えるかもしれませんが!、空の文字列が一致するため、これはまったく同じではありません。したがって、文字クラスの先頭にキャレットを配置して、セットを補完する必要があります/[^\p{Letter}\p{Digit}\p{Space}]/

数字以外の文字、数字以外の (空白) スペース文字、スペース以外の数字文字などを取得するため、単一のプロパティを使用する場合と同じように意味を反転することはできません。\p\P/[\P{Letter}\P{Digit}\P{Space}]/

ただし、使用する理由はまだありません/i

于 2010-10-20T03:33:31.237 に答える
2
[^\p{Alnum}\d ] # NOT alnum or space
于 2010-10-20T05:13:53.647 に答える