这个正则表达式有什么问题(如果正则表达式正则表达式)

时间:2012-12-12 07:29:05

标签: javascript regex

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

  1. 任何整数//例如1,3,9,9239都有效
  2. 实数,小数点后的一点,例如。 1.2,93.7有效,61.37,55.67无效
  3. 也允许在此之后只输入小数和一位数,即.7是有效输入(将被视为0.7)
  4. 我找到了这个页面,http://www.regular-expressions.info/refadv.html
    所以我认为是

    1. 有一个数字
    2. 如果之后有数字和小数,则
    3. 之后必须有一个数字
    4. 如果没有数字,则必须有小数点和后面的数字
    5. 所以,我制作的正则表达式是..

      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
      

      整体表达式=&gt;

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

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

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

      ps:那里的pattern1和pattern2与我的previous question相关。

4 个答案:

答案 0 :(得分:2)

也许你太复杂了。我做了一个快速测试,除非我遗漏了这个正则表达式似乎工作正常:

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

演示: http://jsbin.com/esihex/4/edit

编辑:要检查长度,您可以在没有正则表达式的情况下执行此操作:

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

请注意,我使用replace删除了这些点,因此在获取长度时它们不会被视为字符。

答案 1 :(得分: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)$/

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

答案 2 :(得分: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"]

所以可能是你所期望的。

答案 3 :(得分:0)

我不知道你正在尝试用你的正则表达式中的那些条件。我也看了你的jsfiddle,它没有为我输出任何内容。但我制作了两个版本的正则表达式,它与文本框的正确值匹配,即^(?!(.{6,}))(?:[1-9]\d*)*(?:\.\d*[1-9])?$^(?!(.{6,}))(?:\d*)*(?:\.\d*)?$

第一个不允许从零开始,或在小数点后以零结束。

如果您需要解释正则表达式,请注释。