0

以下のプログラムを実行すると、結果として何も表示されませんでした ("")。
シナリオ 1:-

$var = "A STITCH IN TIME SAVES NINE";
       if ($var =~ /[1..9]/i) {
         print "FOUND\n"
      }

しかし、「..」演算子の前後にスペースを追加すると、結果として「 Found and is 」がスローされました。

シナリオ:-2

 $var = "A STITCH IN TIME SAVES NINE";
           if ($var =~ /[1 .. 9]/i) {
             print "FOUND\n"
          }

ここで何が起こっているのか誰か説明してもらえますか??

4

3 に答える 3

5

以下のプログラムを実行すると、結果として何も表示されませんでした ("")。

文字列に 1、ピリオド、または 9 が含まれていません。パターンが文字列内のいずれとも一致しません。

しかし、「..」演算子の前後にスペースを追加すると、結果として「 Found and is 」がスローされました

複数のスペースが含まれています。一致する文字クラスを展開してスペースを含めると、一致します。

ステートメントに「$i」も含めましたが、それでも値は示されませんでした。

を定義することはありません$i。そこから読み取ろうとするだけです。

于 2013-04-11T08:43:26.517 に答える
4

「..」は文字クラスの範囲を示すのではなく、ピリオド (2 回 :-)) を示します。文字列に 1 、終止符、または 9 がないため、最初のラウンドでは一致しません。

また、どこにも $i を設定していません。$i は単なる通常のスカラー変数であり、魔法のように何も入力されません。正規表現 (/i) の末尾にある i フラグは、大文字と小文字を区別しない検索を意味します ($i にデータが入力されていると思われる場合)

于 2013-04-11T08:46:53.293 に答える
1

正規表現言語はPerl に組み込まれていますが (逆も同様です)、Perl と構文を共有しません¹。これは、繰り返しまたは範囲の他の構文を意味します。

1) 正規表現は Perl 文字列と構文を共有しますが、2 つには完全な互換性はありません\b。エスケープの異なる意味を参照してください。

文字クラスは、複数のプロパティのセットを定義します。指定されたプロパティのいずれかが一致する場合、文字クラスが一致します。charclass には以下を含めることができます。

  • like [aeiou](小文字の母音に一致)
  • 範囲、コード ポイントの連続した範囲に一致する: [A-Z](大文字のラテン文字)
  • charclass 全体の否定: [^'](一重引用符ではないすべて)
  • \d,のような名前付き charclasses \w(そして Unicode プロパティの多くの楽しみ)
  • (POSIX 文字クラス)

charclass に 1 つの文字が複数回含まれている場合、セット ユニオンのように動作するため、これは無関係です。

charclasses のメタ文字は次のとおりです。

  • ]: 試合終了。charclassを空にすることはできないため、角括弧を一致させるには[\[\]]、またはを実行する必要があります。[][]
  • ^先頭の位置だけが特殊な否定演算子:[~&|^]は、ビットごとの論理 Perl 演算子のいずれかと一致します。
  • 範囲演算子-. リテラルのマイナスに一致させるには、charclass の最後に置くことができます: クラス[+-*]は無効になります (の*+にあるため、クラスは空であり、これは違法です) が、問題なく[+*-]動作します
  • バックスラッシュは依然としてエスケープ文字です。

/xフラグの下であっても、文字クラス内ではスペースが重要です。

あなたのcharclassesで:

  • [1..9], と書くこともでき、ピリオドはcharclasses 内のメタ文字ではないため、 、または[19.]と一致します。19.
  • [1 .. 9]と書くことができ[19. ]、さらにスペースに一致します。上で述べたように、文字クラスでは空白が重要です。

あなたがおそらく意味したこと:

0数字のいずれかまたは1に一致させたい場合は9、範囲を使用できます[0-9]。マイナスは charclasses の範囲演算子であることを思い出してください。

于 2013-04-11T11:15:40.887 に答える