Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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,是否可以从导致与正则表达式不匹配的字符串(其索引)中输出第一个字符?是否可以只使用正则表达式匹配操作,或者必须使用更复杂的操作 例如,在JavaScript中,我可能有一个正则表达式/^\d{3}\s\d{2}$/,它将字符串与3位数字后跟一个空格和另外2位数字相匹配。我有一个字符串“123a45”,我将此正则表达式应用于该字符串。执行此操作(例如,“123a45.match(/^\d{3}\s\d{2}$/))将返回null,因为正则表达式不匹配。如何获取导致此不匹配的第一个字符(在本例中为“

是否可以从导致与正则表达式不匹配的字符串(其索引)中输出第一个字符?是否可以只使用正则表达式匹配操作,或者必须使用更复杂的操作

例如,在JavaScript中,我可能有一个正则表达式
/^\d{3}\s\d{2}$/
,它将字符串与3位数字后跟一个空格和另外2位数字相匹配。我有一个字符串
“123a45”
,我将此正则表达式应用于该字符串。执行此操作(例如,
“123a45.match(/^\d{3}\s\d{2}$/)
)将返回
null
,因为正则表达式不匹配。如何获取导致此不匹配的第一个字符(在本例中为
“a”
,即索引为3的字符)


这种情况的一个用例是,根据用于验证的某个正则表达式,将用户直接指向导致用户输入的字符串无效的字符。

您需要将正则表达式模式分解为所有可能的匹配模式,以进行部分匹配,并从最长顺序排列这些模式列表匹配最短的一个(或无)。一旦获得匹配,计算(部分)匹配的长度,就会得到导致不匹配的字符的位置。来自该位置的长度为一个字符的子字符串正是此不匹配背后的字符(如果有的话)。如果没有不匹配,则返回空(子)字符串


要详细解释输入无效的原因,最好编写一个小型解析器并提供反馈。可以将用户指向导致问题的字符,并给出更有用、更有针对性的错误消息

在解析器中,您可以使用正则表达式断言字符串中的某些属性,以生成目标错误消息。例如,如果输入必须包含6个字符,前3个字符是数字,后3个字符是字母,则可以编写正则表达式来断言输入的长度,以便向用户报告错误


或者使用您一直在使用的正则表达式,并提供一条通用错误消息(以及有关如何正确输入的有用说明)。普通用户最多应能在2-3次尝试中正确输入数据。除此之外,它可能是恶意用户,或者输入的数据不适用于所有用户,或者您的说明不足。

是否需要添加简短的解释?您认为这是一种适用于所有类型正则表达式的通用解决方案?您认为可以自动生成包含所有部分匹配正则表达式的“扩展”正则表达式吗?@jindrichm-每个固定长度的非可选模式都可以分解。所以下面的例子不能:(1)
\d{2,4}:\d{1,2}
,(2)
(\w{3}\d{2}\d{3}\w{2})
,等等。是的,我看到大多数正则表达式不能这样处理。我认为最好按照@nhahtdh的建议去做——编写一个自定义解析器。@jindrichm——是的,解析器是更安全的解决方案。我发布了我的正则表达式解决方案,因为您要求使用正则表达式,所以。。。但是我必须纠正我自己-替代模式可能会被分解,所以问题是可变长度(子)模式,所以如果您想使用regex,那么使用
{m,n}
+
*
是您需要避免的。例如,电话号码
\d{3}[-.]\d{3}[-.]\d{4}
的正则表达式是可以的,即使有替代的分隔符破折号或句号/点。好吧,你必须决定。。。祝你好运(Velaštestía všecho dobré,Jindřichu!)很可能广义问题是不可行的(一个例子是带有或
的正则表达式,您不知道是哪个字符导致问题,因为有两种可能的情况)。对于某些特定的问题,可能在某种程度上是可能的。您能否以某种方式确定匹配失败时使用了带有
的正则表达式的哪个部分?例如:
([a-Z][0-9]{2}[a-Z]{2}[a-Z])
并输入
090
,您将报告哪个字符?第一个
0
还是最后一个
0
?匹配失败是因为它失败了
指定的所有情况,并且原因可能是多种多样的,正如所指出的。是的,简单地识别导致不匹配的第一个字符不适用于不明确的情况。
var s = "123a45";
alert(s.substr(s.match(/^(\d{3}\s\d{2}|\d{3}\s\d|\d{3}\s|\d{0,3})/)[1].length,1));