3

正規表現を書いています。この時点で、任意の桁数が許可されます。

^(([1-9]*)|(([1-9]*).([0-9]*)))$

合計で正確に64桁を許可するにはどうすればよいですか?

4

4 に答える 4

3

正規表現

実際の動作をご覧ください。

(?=^\d*\.?\d*$)^(\.?\d){64}$

説明

(?=^\d*\.?\d*$)     # Can contain maximum one dot in total between digits
^(\.?\d){64}$       # Match exactly 64 digits, dot is optional

2行目では、合計64桁、オプションで任意の数のドットと一致します。最初の行は、複数のドットを含む文字列を除外します。その結果、正規表現は64桁と最大1ドットで構成される文字列を提供します。

マッチングサンプル

2352352363463456346444651346546213165498546516854985213242135355
.2352352363463456346444651346546213165498546516854985213242135355
235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355

一致しないサンプル

235235236346345634644465134654621316549854651685498521324213535
2352352363463456346444651346546213165498546516854985213242135355.
..235235236346345634644465134654621316549854651685498521324213535
..2352352363463456346444651346546213165498546516854985213242135355
23523523.63463456346444651346546213165498.546516854985213242135355
23523523.63463456346444651346546213165498.54651685498521324213535
于 2012-08-31T06:56:29.667 に答える
1

この正規表現を試してください:

^\d{64}$

ルーブラリンク

ただし、以下の例のように、10進数で64の精度が必要な場合(問題の正規表現から示唆されるように)、

235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355

小数点の前後の桁数は可変ですが、合計で64になる場合は、文字列操作を使用して数値から小数点を削除し、上記の正規式を検証に適用する(または単に長さを検証する)ことをお勧めします。文字列の)。


正規表現に固執している場合は、次のことを試してみてください。

^((?:[1-9]\d{63})|(?:(?=[\d.]{65})(?![\d.]{66})(?:[1-9]\d*|0)\.\d*[1-9]))$

壊す:

  • (?:[1-9]{64}):これはすべての桁をカバーし、小数点は含まれません。
  • |:大きな論理OR。
  • (?=[\d.]{65}):数字とポイントのみを許可し、入力の合計文字数が65以上であることを確認するための積極的な先読み。
  • (?![\d.]{66}):数字とポイントのみを許可し、入力の合計文字数が65文字を超えないようにするための負の先読み。
  • (?:[1-9]\d*|0):小数点以下の桁は、それが唯一の桁である場合を除いて、先行ゼロがあってはなりません。
  • \.:小数点が1回だけ発生し、それ以上は発生しないようにします(先読みで許可されているように)。
  • \d*[1-9]:小数点以下の桁がゼロで終わらないようにします。

これは一致します:

235235236346345634644.4651346546213165498546516854985213242135355
235.2352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242135355
2352352363463456346444651346546213165498546516854985213242135355
0.465168549852132421353551545656456489155456651654654245646564558
2.465168549852132421353551545656456489155456651654654245646564558

そして、一致しません:

0352352363463456346444651346546213165498546516854985213242135355
23523523634634563464446513465462131654985.46516854985213242100000
00.46516854985213242135355154565645648915545665165465424564656454
2352352363463456346444651346546213165498546516854985213242

(追記:私はこれを承認しませんが、試してみるのは楽しかったです。)

このRubularリンクでさまざまな入力をテストしました。

コメントでの@acheong87の前向きな先読みは、この正規表現につながるのに役立ちました。

于 2012-08-30T18:18:40.733 に答える
0

*を{n、m}に置き換えます。ここで、nは最小一致、mは最大一致です(例:{0,64})。

または、正確に64(それ以上)に一致させたい場合は、{64}を実行できます。

このリファレンスを参照してください正規表現言語-クイックリファレンス

于 2012-08-30T18:17:45.493 に答える
0

この正規表現を試してください:http://regex101.com/r/qM9mO8

/^(?:\d{64}|(?=.*\.)(?!.*\..*\.)[\d.]{64})$/gm

この正規表現は、64桁の連続桁または63桁と1ドットで機能します。

あなたの表現を考えれば、これがあなたが探していたものだと思いました。

幸運を!

于 2012-08-30T19:41:30.710 に答える