5

What I want is, there is a textbox with maximum length of 5. The values allowed are..

  1. any integer // for example 1, 3, 9, 9239 all are valid
  2. real number, with exaclty one point after decimal // eg. 1.2, 93.7 valid and 61.37, 55.67 invalid
  3. it is also allowed to enter only decimal and a digit after that, that is .7 is valid entry (would be considered as 0.7)

I found this page, http://www.regular-expressions.info/refadv.html
So what I thought is that

  1. There is a digit
  2. If there is a digit and a decimal after that, there must be one number after that
  3. If there is no digit there must be a decimal and a digit after that

So, the regex I made is..

a single digit one or more => /d+  
an optional decimal point followed by exactly one digit => (?:[.]\d{1})?  
if first condition matches => (?(first condition) => (?((?<=\d+)  
then, match the option decimal and one exact digit =>(?((?<=\d+)(?:[.]\d{1})?  
else => |
find if there is a decimal and one exact digit => (?:[.]\d{1}){1}  
check the whole condition globally => /gm

overall expression =>

(?(?<=\d+)(?:[.]\d{1}){1}|(?:[.]\d{1}){1})+/gm

But it doesn't outputs anything..
Here's the fiddle

http://jsfiddle.net/Fs6aq/4/

ps: the pattern1 and pattern2 there, are related to my previous question.

4

4 に答える 4

2

物事を複雑にしすぎているのかもしれません。簡単なテストを行いましたが、何か不足していない限り、この正規表現は正常に機能しているようです:

/^\d*\.?\d$/

デモ: http://jsbin.com/esihex/4/edit

編集:長さを確認するには、正規表現なしで実行できます:

if ( value.replace('.','').length <= 5 && regex.test( value ) ) {
  ...
}

replace長さを取得するときにドットが文字としてカウントされないように、以前はドットを削除していたことに注意してください。

于 2012-12-12T07:47:54.760 に答える
1

次のパターンを試すことができます。

/^\d{0,4}\.?\d$/

すべての要件を満たしているようです。

> /^\d{0,4}\.?\d$/.test(".4")
  true
> /^\d{0,4}\.?\d$/.test(".45")
  false
> /^\d{0,4}\.?\d$/.test("1234.4")
  true
> /^\d{0,4}\.?\d$/.test("12345.4")
  false
> /^\d{0,4}\.?\d$/.test("12345")
  true
> /^\d{0,4}\.?\d$/.test("123456")
  false

このパターンは、数値に最大5桁とオプションの小数点を含めることができることを前提としています。

最大長5にオプションの小数点が含まれている場合、パターンは少し複雑になります。

/^(?:\d{1,5}|\d{0,3}\.\d)$/

グループの最初の部分は必要な長さの整数を扱い、グループの2番目のオプションは最大長(小数点を含む)が5である実数を扱います。

于 2012-12-12T08:07:13.040 に答える
1

次のコードを検討してください。

var checkedString = "45.3 fsd fsd fsdfsd 673.24 fsd63.2ds 32.2 ds  32 ds 44 fasd 432 235f d653 dsdfs";
checkedString = " "+checkedString;
var results = checkedString.match(/[\s]{1}(\d+\.*\d{1})(?![\d\.\w])+/gm);
results.map(function(result) {
    return result.trim();
});

(?<=JS (後読み) では正規表現が機能しないため、他の方法では作成できませんでした。

これが返されます:

["45.3","32.2","32","44","432"]

だからおそらくそれはあなたが期待したものです。

于 2012-12-12T08:41:23.060 に答える
0

正規表現でこれらの条件を使用して何をしようとしているのかわかりません。私はあなたのjsfiddleも見ましたが、何も出力しません。しかし、テキストボックスの正しい値に一致する 2 つのバージョンの正規表現を作成しまし^(?!(.{6,}))(?:[1-9]\d*)*(?:\.\d*[1-9])?$^(?!(.{6,}))(?:\d*)*(?:\.\d*)?$

1 つ目は、ゼロで開始すること、または小数点の後にゼロで終了することを許可しません。

正規表現の説明が必要な場合はコメントしてください。

于 2012-12-12T08:01:30.120 に答える