3

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

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

一个用例可能是将用户直接指向导致用户输入的字符串根据用于其验证的某些正则表达式无效的字符。

4

2 回答 2

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));

http://jsfiddle.net/ETWWS/

于 2012-07-21T19:58:08.390 回答
2

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

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

要么这样,要么只使用您一直在使用的正则表达式并提供通用错误消息(有关如何正确输入的有用说明)。普通用户最多2-3次就可以正确输入数据。在此之上,可能是恶意用户,或者要输入的数据不适用于所有用户,或者缺少您的指令。

于 2012-07-21T20:09:28.333 回答