0

まだまだ正規表現勉強中!私のパーセンテージ正規表現(100制限を尊重しない):

^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?\%?$

これにより、次のこと可能になります。

  • [1-9] 0 以外の数字から始めてください。「004.34」のようなパーセンテージは使用できません。
  • [0-9]*...0 から 9 までの任意の数字が続く
  • |[0]または単一の 0 で開始

... このグループを「int」グループとしてキャプチャします。それで:

  • (?<dec>\.[0-9]+)?オプションのグループで、0 から 9 までの数字が 1 つ以上続く場合にのみポイントが許可されます。「33」などを入力してほしくありません。

私が正しいと仮定して、以下でテストします:

preg_match('/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?\%?$/i', '0.32%', $result);

実際には正しいこの結果が得られますが、次のようになります。

Array
(
    [0] => 0.32%
    [int] => 0
    [1] => 0
    [dec] => .32
    [2] => .32
)

パーセンテージ「%」記号 ( ) をキャプチャしないようにするにはどうすればよい$result[0]ですか?

4

2 に答える 2

6

それは本当にとても簡単です。正規表現を次のように変更するだけです。

/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?/

\%?$(マッチングから削除)。

% 記号があることを確認したいが、それをキャプチャしたくない場合 (この場合は問題にならないように思えますが、おそらく)、先読みアサーションを追加できます。(?=...)アサーションはパターンが存在することを確認しますが、一致するものは変更しません。

/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?(?=%?$)/
于 2012-09-21T17:29:37.940 に答える
1

配列の最初の要素に$resultは常に完全なパターン マッチが含まれます (PHP にそうしないように指示することはできません。ここを参照してください)。そのため、正規表現自体で問題を解決する必要があります。正規表現では、パターン文字列 (記号)の末尾の直前 (および内部) に現れる可能性があることを明示的に伝えるため、完全なパターン一致%にあることを指定しています。ここで実行します。$\%?$

解決策は、先読みで を指定することです%(パターン文字列に入らないようにするため)。 yourは%オプションであるため、先読みで a%または 文字列の末尾を探すように指示します。%パターンマッチ。

そのため、記号または文字列の末尾を(?=\%|$)先読みするように正規表現に指示するものを追加しました。%

したがって、次の正規表現:

preg_match('/^(?<int>[1-9][0-9]*|[0])(?<dec>\.[0-9]+)?(?=\%|$)/i', '0.32%', $result);

「0.32%」と「0.32」の両方が出力されます。

array(5) {
  [0]=>
  string(4) "0.32"
  ["int"]=>
  string(1) "0"
  [1]=>
  string(1) "0"
  ["dec"]=>
  string(3) ".32"
  [2]=>
  string(3) ".32"
}

更新:いくつかのテストを行った後、完全な回答を更新したので、上記を読んでください

于 2012-09-21T17:32:55.073 に答える