2

問題をデバッグするためにいくつかの古い PERL/CGI コードを調べたところ、次の多くの使用法に気付きました。

\d - Match non-digit character
\D - Match digit character

ほとんどのオンライン ドキュメントでは、\d は [0-9] と同じであると述べられています。これは、私が常に考えていることです。しかし、文字セットの違いについて言及している Stackoverflow Questions にも気付きました。

正規表現の「\d」は数字を意味しますか?

\d はマイナス記号や小数点にも一致しますか?

私はいくつかのテストを行うために出発しています。

4

3 に答える 3

11

\d はマイナス記号や小数点にも一致しますか?

いいえ

于 2013-05-06T23:39:51.023 に答える
8

PerlがデフォルトでUnicode を使用するか、ASCII を使用するか、またはロケールを使用するかをどのように決定するのかわかりません(フラグなし、 no use)。use re '/a';いずれにせよ、 (ASCII)、use re '/u';(Unicode)、または(ロケール)を宣言するuse re '/l';ことで、使用するモードを Perl インタープリター (および人間のリーダー) に明確に示し、予期しない動作を回避します。

修飾子の効果により、\d少なくとも 2 つの意味があります。

  • /aフラグ (ASCII)の影響下で、 ~ から(それ以上でも以下でもない) の\d数字に一致します。09
  • /uフラグ (Unicode)の影響下で\d、任意の言語の任意の 10 進数に一致し、\p{Digit}referenceと同等です。これは\d+、どの言語でも数字を混在させることができるため、事実上、かなり役に立たず、使用するのが危険になります。

    /u旗の説明より引用

    また、\d+は、異なる書記体系が混在する数字の文字列と一致する可能性があり、セキュリティ上の問題が発生します。num() in Unicode::UCDこれを整理するために使用できます。または/a修飾子を使用して\d、ASCII 0 から 9 のみに一致させることもできます。

\dこれらの文字はUnicode の一般カテゴリNd(数字、10 進数) に属さないため、記号や句読点には一致しません。

于 2013-05-06T23:39:23.980 に答える
3

答えはノーだ。数字チェックを行うだけです。ただし、Unicode は物事をもう少し複雑にします。

何かが数値 (10 進数) であることを確認したい場合は、Scalar::Utilモジュールを参照してください。それが持っている機能の1つはですlook_like_number。これは、見ている文字列が数値であるかどうかを確認するために使用でき、正規表現を使用するよりもうまく機能します。

このモジュールはしばらくの間、標準の Perl の一部であったため、システムにインストールする必要があります。

于 2013-05-07T04:17:50.097 に答える