3

必要なものに対して有効な正規表現を作成したと思います。誰かがそれを壊したり、それを書くためのより短い方法を見たりできるかどうか疑問に思っています.

正規表現は以下を検証する必要があります...

  • ドル記号はオプション
  • マイナスではなく、括弧で囲まれた負の数
  • 負の場合、ドル記号は括弧の外にある必要があります
  • カンマはオプションです
  • 最大数は 999999.99 です
  • 最小数は (999999.99)
  • 小数を指定する必要はありませんが、指定する場合は 2 桁までです

だからここにいくつかの有効なものの例があります...

9
$9
$0.99
($999,999.99)
(999999)
($999999)
(999,999)
99,999.9

これは私が思いついたものです:

^\$?(((\d{1,6}(\.\d{1,2})?)|(\d{1,3},\d{3}(\.\d{1,2})?)|\(((\d{1,6}(\.\d{1,2})?)|(\d{1,3},\d{3}(\.\d{1,2})?))\)))$

訂正、仕様が間違っていました。ドル記号を使用する場合は、括弧の内側にある必要があります。

4

3 に答える 3

11

これは、ほとんどすべての正規表現フレーバーで機能する、より短い代替手段 (114 文字に対して 56 文字) です。

^\$?(?=\(.*\)|[^()]*$)\(?\d{1,3}(,?\d{3})?(\.\d\d?)?\)?$

例: http://www.rubular.com/r/qtYHEVzVK7

説明:

^                # start of string anchor
\$?              # optional '$'
(?=              # only match if inner regex can match (lookahead)
   \(.*\)          # both '(' and ')' are present
   |               # OR
   [^()]*$         # niether '(' or ')' are present
)                # end of lookaheand
\(?              # optional '('
\d{1,3}          # match 1 to 3 digits
(,?\d{3})?       # optionally match another 3 digits, preceeded by an optional ','
(\.\d\d?)?       # optionally match '.' followed by 1 or 2 digits
\)?              # optional ')'
$                # end of string anchor
于 2012-12-12T21:19:13.053 に答える
3

「1 桁から 6 桁の間。最後の 3 桁の前のカンマはオプションです」は、もう少し簡潔に\d{1,3}(,?\d{3})?. これにより、 のコピーを 2 つだけ含めることもできます(\.\d{1,2})?。1 つはポジティブ用、もう 1 つはネガティブ用であり、1 つはコンマなしのポジティブ用、もう 1 つはカンマ付きのポジティブ用などです。

また、それが改善されるかどうかはわかりませんが、\d{1,2}わずかに に短縮できます。\d\d?

(?(1))したがって、後方参照が設定されているかどうかをテストするような表記法を除いて、ここに私が見る最短のバージョンがあります:

^(\$?\d{1,3}(,?\d{3})?(\.\d\d?)?|\(\$?\d{1,3}(,?\d{3})?(\.\d\d?)?\))$

あなたの正規表現とこれのおそらく望ましくない側面の1つは、 のようなものを許可することです$00,012.7。最初の桁がゼロ以外であることを要求し、処理する特別なケースを追加するなどして、これに対処でき$0ます(0.12)

^(\$?(0|[1-9]\d{0,2}(,?\d{3})?)(\.\d\d?)?|\(\$?(0|[1-9]\d{0,2}(,?\d{3})?)(\.\d\d?)?\))$

追加するように編集: FJ が彼/彼女の回答で提案するような先読みアサーションを使用すると、後者は次のように短縮できます。

^(?!\(.*[^)]$|[^(].*\)$)\(?\$?(0|[1-9]\d{0,2}(,?\d{3})?)(\.\d\d?)?\)?$
于 2012-12-12T21:16:23.613 に答える
3

例を考えると、次の正規表現が機能します。

/^(\$?(?(?=\()(\())\d+(?:,\d+)?(?:\.\d+)?(?(2)\)))$/gm

(注: フラグと区切り文字は言語に依存します)

この正規表現は、正規表現の長さを節約するためだけに不要な後方参照を設定します。2 番目の後方参照は無視できます。これがたまらないと表現がかなり長くなってしまいます。

ここを見てください:http://regex101.com/r/fH3lV1

于 2012-12-12T21:14:52.943 に答える