Javascript 为什么一些有效的正则表达式不能与html5模式属性一起工作?

Javascript 为什么一些有效的正则表达式不能与html5模式属性一起工作?,javascript,regex,html,Javascript,Regex,Html,看这把小提琴: 如果打开控制台,可以看到模式属性((?=^[0-9]*(\.[0-9]+)?$)(?=.[1-9]))中的正则表达式按照JS的预期工作,但是当您在输入中输入任何内容并尝试提交时,它会失败 如果我的正则表达式有问题,我只是尝试将其限制为大于0的数字。我想使用数字输入(即,),但我不能,因为它不允许您格式化值(例如,它将0.00000001显示为1e-8,这是不可取的) 我在这里一窍不通。有什么我遗漏的吗?为什么不起作用?您可以尝试以下模式: ^(?:0+\.0*[1-9][0-9]

看这把小提琴:

如果打开控制台,可以看到模式属性(
(?=^[0-9]*(\.[0-9]+)?$)(?=.[1-9])
)中的正则表达式按照JS的预期工作,但是当您在输入中输入任何内容并尝试提交时,它会失败

如果我的正则表达式有问题,我只是尝试将其限制为大于0的数字。我想使用数字输入(即,
),但我不能,因为它不允许您格式化值(例如,它将0.00000001显示为1e-8,这是不可取的)


我在这里一窍不通。有什么我遗漏的吗?为什么不起作用?

您可以尝试以下模式:

^(?:0+\.0*[1-9][0-9]*|0*[1-9][0-9]*(?:\.[0-9]+)?)$

当您将模式与锚定一起使用时(如中所指定),Javascript也会失败

var pattern = '^(?=^[0-9]*(\.[0-9]+)?$)(?=.*[1-9])$';
var reg = new RegExp(pattern);
console.log(reg.test('1.0')); // will fail
console.log(reg.test('0.0')); // will fail
参见修改的

如果要将输入限制为非空数字,可以使用

\d*[1-9]\d*(?:\.\d*)?|\d+\.\d*[1-9]\d*
此模式要求在小数点之前或之后至少有一个非空数字


请参见

我怀疑
模式
属性是在浏览器的核心中实现的(即:不在JavaScript引擎中),并且他们使用的任何regexp库都无法处理零宽度断言。啊哈!它需要匹配整个输入值(而不仅仅是某个子集)。。。尝试使用锚定?以下是What Working Group文档中的相关部分:
这意味着用于此属性的正则表达式语言与JavaScript中使用的正则表达式语言相同,只是模式属性与整个值匹配,而不仅仅是任何子集(有点像它暗示了^(?:在模式的开头,结尾是a)$。
whelp.我错了(假设实现按照工作组草案的描述工作。我没有否决投票,但我猜这是因为你没有回答问题;)非常有趣。谢谢你的回答!在我原来的正则表达式末尾添加
*
会有什么问题吗?