是否可以从字符串(其索引)输出导致与正则表达式不匹配的第一个字符?是否可以使用正则表达式匹配操作或者必须使用更复杂的东西?
例如,在JavaScript中,我可能有一个正则表达式/^\d{3}\s\d{2}$/
,它匹配3个数字后跟空格和另外2个数字的字符串。我有一个字符串"123a45"
,我应用这个正则表达式。这样做(例如,"123a45".match(/^\d{3}\s\d{2}$/)
)会返回null
,因为正则表达式不匹配。如何获得导致此不匹配的第一个字符(在本例中为"a"
,索引为3的字符?)
一个用例可能是根据用于验证的一些正则表达式将用户直接指向导致用户输入的字符串无效的字符。
答案 0 :(得分:3)
您需要将正则表达式模式分解为部分匹配的所有可能匹配模式以及从最长匹配到最短匹配(或无)匹配的此类模式列表。一旦你匹配,计算(部分)匹配的长度,你将获得导致不匹配的角色的位置。长度为一个字符的那个位置的子串正是这个不匹配背后的字符(如果有的话)。如果没有不匹配,则返回空(子)字符串。
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));
答案 1 :(得分:2)
要提供有关输入无效原因的详细说明,最好编写一个小解析器并提供反馈。可以将用户指向导致问题的角色,并提供更有帮助和有针对性的错误消息。
在解析器中,您可以使用正则表达式来断言字符串中的某些属性以生成目标错误消息。例如,如果输入必须包含6个字符,并且前3个字符是数字,最后3个字符是字母字符,那么您可以编写正则表达式来断言输入的长度以向用户报告错误。
或者只是使用你一直在使用的正则表达式并提供一般错误信息(有关如何正确输入的有用说明)。普通用户应该能够在最多2-3次尝试中正确输入数据。在此之上,它可能是恶意用户,或者输入的数据不适用于所有用户,或者您的指令缺乏。