CSS数値式パーサーとバリデーター

現在のプロジェクトで、CSS3の:nth-​​child()で使用されているのと同様の数値式を解析し、検証する必要があります。基本的には、 ab は整数値(正と負の両方)でなければならない an + b です。また、 0 と同じにすることもできます。

2n + 12n4n + 2 は、 。基本的には、 ab は任意の種類の符号付きまたは符号なしの整数です。

次の例:

  • n (a=1, b=0)
  • n+1 (a=1, b=1)
  • 1 (a=0, b=1)
  • 2n+1 (a=2, b=1)
  • 23n+45 (a=23, b=45)
  • 2n-2 (a=2, b=-2)
  • -1 (a=0, b=-1)
  • -2n (a=-2, b=0)

すべて有効です。これは、 a または b が整数でない場合や、式に他の文字がある場合にのみ失敗します。

私はこれらの式をどのように構文解析し、検証することができるか知りたいです。私は適切なソリューションがREGEXesであると信じていますが、私はこれをどう構築することができないのでしょうか。

0
提出された式がREGEXと一致する場合はtrueを返し、検証をパスします。私はREGEX自体にもっと興味があります。私はこれをPHPで使用しています。
追加された 著者 linkyndy,
@ CodeJockey、私はこれをPHPで実装しています。私はあなたの答えにコメントをつけてもっと多くの例を提供しました。
追加された 著者 linkyndy,
近いかもしれないが、検証に合格してはならない事柄の例を提示してください
追加された 著者 Code Jockey,
どの言語がこの表現を実装していますか? Java? PHP? 。ネット? JavaScript?また、 b に対して +1 結果を表示することは望ましくないか、または容認できますか?
追加された 著者 Code Jockey,
@linkyndy、ああ、申し訳ありませんが、私はあなたが "validate"と言ったところの "評価"を読んでいます。決して私のコメントに気をつけない。
追加された 著者 Bart Kiers,

2 答え

編集: revised to allow negative numbers as specified in the question END EDIT

これらが有効な値の場合:

5n+12   3456    -5     2     123n+6  8n    13n-6    n+2

そしてこれらは無効です:

25n.1   4x+4    2n+    6N-2  8n-+5   n+-3  Rn+T     x+1

この式は検証する必要があります:

^(-?\d+(n([+-]\d+)?)?)$

この表現は次のとおりです。

^           # Assert beginning of line
(\d+        # Match one or more digits
  (n        #   TRY to Match a literal n character
    (\+\d+  #     TRY to match a literal plus character followed by one or more digits
    )?      #     END TRY
  )?        #   END TRY
)           # End Match
$           # Assert at end of string

TRY は検証を試みますが、存在しないかどうかは気にしません。

編集:

上記の式は検証する必要がありますが、この式では名前付きキャプチャグループ ab を使用して求める結果を正確に生成する必要があります。 + シンボルを除外するには、 ab

^(?:(?:(?P-?\d*)n)?(?=[+-]?\d+|$)\+?(?P-?\d+)?)$ 

結果は次のようになります。

 source     a       b
------     ------  ------
 5n+12      5       12
 3456               3456
 2                  2
 123n+6     123     6
 8n         8           
 -5                 -5
 13n-6      13      -6
 n+2                2
 n

Because I am not completely sure how the vs ,zero length or null string> dichotomy works in PHP and preg_match_all, I would recommend using this expression if you encounter any problems differentiating between the results for n+2 and 2:

^(?:(?P(?P-?\d*)n)?(?=[+-]?\d+|$)\+?(?P-?\d+)?)$ 

これは、 "n"式全体をキャプチャし、 n + 2212n + 2

 source    n        a       b
------     ------  ------  ------
 2                          2
 n+2       n                2
 12n+2     12n      12      2
3
追加された
n + 2 は有効である必要があります。基本的には、 ab は任意の種類の符号付きまたは符号なしの整数です。 n(a = 1、b = 1) 1(a = 0、b = 1) n(a = 1、b = 0) 23n + 45(a = 23、b = 45) 2n(a = 2、b = 1) -1(a = 0、b = -1)-2n(a = -2、b = -2) 0)がすべて有効です。これは、 a または b が整数でない場合や、式に他の文字が含まれている場合にのみ失敗します。
追加された 著者 linkyndy,
あなたの非常に詳細な答えをありがとう!
追加された 著者 linkyndy,

あなたは ^(?:(?:(??\ d *)n)?([+ - ] \ d +)?|(\ d +))$ これは、2つの成功したキャプチャグループの2つの数値を返します。

1
追加された
したがって、これは ab の数値が正しく書式化されているかどうかを返します(整数)。また、文字列に an + b 式以外の文字列を含めるべきではありません。コードスニペットでこれを考慮しましたか?申し訳ありませんが、REGEXでの私のスキルは非常に低いです:)
追加された 著者 linkyndy,
あなたの説明をありがとう。私は知っている、私はそれらを学ぶ必要があります。
追加された 著者 linkyndy,
2つ目のキャプチャグループ(2番目または3番目のいずれか)に2番目の数字をキャプチャし、 + をキャプチャします。/code>のものを削除することができます。そうでなければ、それは有効です! <�?>(?:(?:(??\ d +)n)?([+ - ]?\ d +)?)$
追加された 著者 Code Jockey,
文字列が正しい場合にのみ一致します。一致する場合は、キャプチャグループとして数値を返します。あなたは正規表現を学ぶべきです。
追加された 著者 SLaks,
@SLaks、あなたの提案されたソリューションも空の文字列に一致します:私はそれが正しいとは思わない。
追加された 著者 Bart Kiers,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com