5

我想要的是,有一个最大长度为 5 的文本框。允许的值是..

  1. 任何整数 // 例如 1, 3, 9, 9239 都是有效的
  2. 实数,小数点后精确一位 // 例如。1.2, 93.7 有效,61.37, 55.67 无效
  3. 也可以只输入小数和之后的数字,即 0.7 是有效输入(将被视为 0.7)

我找到了这个页面,http://www.regular-expressions.info/refadv.html
所以我的想法是

  1. 有一个数字
  2. 如果后面有一个数字和一个小数,那么后面一定有一个数字
  3. 如果没有数字,则必须有一个小数,然后是一个数字

所以,我做的正则表达式是..

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

整体表达 =>

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

但它没有输出任何东西..
这是小提琴

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

ps:那里的pattern1和pattern2,和我之前的问题有关

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 包括可选的小数点,则模式稍微复杂一些:

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

该组的第一部分处理所需长度的整数,该组的第二个选项处理最大长度(包括小数点)为五的实数。

于 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 (?<=(lookbehind) regexp 中不起作用。

这将被返回:

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

所以可能这就是你所期望的。

于 2012-12-12T08:41:23.060 回答
0

我不知道你想用你的正则表达式中的这些条件做什么。我还查看了您的 jsfiddle,它对我没有任何输出。但是我制作了两个版本的正则表达式,它们与文本框的正确值相匹配,它们是^(?!(.{6,}))(?:[1-9]\d*)*(?:\.\d*[1-9])?$^(?!(.{6,}))(?:\d*)*(?:\.\d*)?$

第一个不允许以零开头,或以小数点后的零结尾。

如果您需要正则表达式的解释,请发表评论。

于 2012-12-12T08:01:30.120 回答