Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript检测当前正则表达式中允许的字符?_Javascript_Regex - Fatal编程技术网

如何使用JavaScript检测当前正则表达式中允许的字符?

如何使用JavaScript检测当前正则表达式中允许的字符?,javascript,regex,Javascript,Regex,在我的web应用程序中,我创建了一些框架,用于将模型数据绑定到页面上的控件。每个模型属性都有一些规则,如字符串长度、NOTNULL和正则表达式。在提交页面之前,框架使用已定义的规则验证任何绑定控件 因此,我想检测每个正则表达式规则中允许的字符,如下面的示例所示 "^[0-9]+$" allow only digit characters like 1, 2, 3. "^[a-zA-Z_][a-zA-Z_\-0-9]+$" allow only a-z, - and _ characters 但

在我的web应用程序中,我创建了一些框架,用于将模型数据绑定到页面上的控件。每个模型属性都有一些规则,如字符串长度、NOTNULL和正则表达式。在提交页面之前,框架使用已定义的规则验证任何绑定控件

因此,我想检测每个正则表达式规则中允许的字符,如下面的示例所示

"^[0-9]+$" allow only digit characters like 1, 2, 3.
"^[a-zA-Z_][a-zA-Z_\-0-9]+$" allow only a-z, - and _ characters
但是,此函数不应关心分组、允许字符的定位。它只讲述可能的角色

你对创建这个函数有什么想法吗

另外,我知道创建指定的函数很容易,比如仅允许数字字符的numeric。但我需要在不修改任何内容的情况下共享/重用数据层(包含所有模型验证器)和UI层的同一段代码


谢谢

我必须承认我正在努力解析你的问题

如果您正在寻找一个正则表达式,它只在字符串完全由某个字符集合组成时才匹配,而不管它们的顺序如何,那么您的字符类示例已经非常接近了


例如,
^[A-Za-z0-9]+$
只允许由字母A到Z(大写和小写)和数字组成的字符串以任何顺序和长度出现。

对于一般情况,您无法解决此问题。regexp通常不会在某个特定的字符上“失败”,它们只是到达一个无法再匹配的点,并且必须回溯以尝试另一种匹配方法

我们可以制作一个regex实现,在回溯之前记住它能够匹配的最远的一个,但是大多数实现都没有做到这一点,包括JavaScript


一种可能的方法是首先匹配
^pattern$
,如果匹配失败,则匹配
^pattern
,而不使用末端锚。这更有可能使您获得字符串左侧部分的某种匹配,因此您可以计算匹配中的字符数,并说以下字符“无效”。对于更复杂的regexp,这可能会产生误导,但对于像
[a-zA-Z0-9\]+

^[a-zA-Z\][a-zA-Z\-0-9]+$
这样的简单情况,这肯定是错误的;将连字符放在末尾:
^[a-zA-Z][a-zA-Z][0-9-][a-zA-Z][u 0-9-][/code>这同样是多余的:将其设置为
^[a-zA-Z][\w-][a-Z][u+$/i][code>^[0-9]$
只允许一个数字,使用+允许一个或多个数字<代码> ^ [09] + $< /代码>或<代码> ^ d+$< /代码>哦,是的,考虑重新提问使问题更清楚。我的正则表达式是正确的。但是Stackoverflow显示为转义字符。我很抱歉。我不解释什么是“两个单词接近”正则表达式。你可以在我知道“两个单词近”正则表达式的含义上看到更多细节;我只是不明白你想用它做什么。你写的是“顺便说一句”,所以这与你的问题无关,或者说是吗?编辑:我看到你已经删除了那个位,所以我也删除了我的:)我只是举一些不应该处理的复杂正则表达式的例子。我只想在你回答时检测特殊情况。它必须像^[some regular expression]$一样,并且不包含任何复杂的正则表达式,比如backtrack。是的,如果失败,尝试在没有
$
的情况下进行匹配。如果您得到了匹配项,
match[0]。length
将为您提供不匹配的第一个字符的索引。我不希望每次使用按键时都运行正则表达式。这对我来说是相当昂贵的计算费用。我只需要一些处理一些正则表达式的程序来显示什么字符是可能的,然后按下check键。如果不进行验证,JavaScript将取消当前事件。这应该不会太昂贵。检查一个短字符串和一个预先构造的、非回溯的正则表达式应该非常快。请注意,只有通过验证整个字符串才能真正做到这一点。即使您设法找到了猜测有效网络字符的方法,您也无法可靠地读取插入到输入中的下一个字符。