这个正则表达式有什么问题(if else 正则表达式)

5
我想要的是一个最大长度为5的文本框。允许的值有:
  1. 任何整数 // 例如 1、3、9、9239 都是有效的
  2. 实数,小数点后恰好有一位 // 例如 1.2、93.7 是有效的,61.37、55.67 是无效的
  3. 也可以只输入小数点和一位数字,即 .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

但它没有输出任何东西..
这是 jsfiddle 的链接:http://jsfiddle.net/Fs6aq/4/
ps:那里的 pattern1 和 pattern2 与我之前的问题有关,详情请参见此处

你在示例中忘记了一个斜杠“/”,所以它无法工作。 - Derek 朕會功夫
2
请注意,JavaScript正则表达式不支持向后查找。 - Bergi
@Bergi:终于!它不工作的原因 - Razort4x
4个回答

2
也许你把事情复杂化了。我进行了一项快速测试,除非我漏掉了什么,否则这个正则表达式似乎很好用:
/^\d*\.?\d$/

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

编辑: 如果要检查长度,可以不使用正则表达式:

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

请注意,我使用了replace来删除点号,以便在获取长度时不将其视为字符。

1
在你的例子中,.7 返回 false,但根据他的要求应该是 true - Derek 朕會功夫
嗯,.7 返回 true,如果允许尾随零,那么正则表达式就可以写成 /^\d*\.?\d0*$/ - elclanrs

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

此模式假设数字最多可以有五位数和一个可选的小数点。

如果五个字符的最大长度包括可选的小数点,则该模式会稍微复杂一些:

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

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

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"]

所以这可能是你预期的。


0

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

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

如果需要解释正则表达式,请留言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接