正则表达式,用于验证信用卡对帐单的对帐单描述符

时间:2019-01-03 21:29:10

标签: javascript regex

我正在尝试验证用户输入的字符串,以用作信用卡对帐单上用于描述购买的对帐单说明。

要求是:

  • 长度必须在5到22个字符之间
  • 必须至少包含一个字母(大小写无关)
  • 不能包含以下字符:<> \'“
  • 仅允许使用ASCII字符

这是我到目前为止所能做的,这是一种的工作方式:

/^(?=.*?[a-zA-Z])[a-zA-Z0-9]{5,22}$/gm

...因为它可以正确检查5-22个字符的长度,并检查至少一个字母。但是,它不允许所有特殊字符和变音符号,而不是不允许的少数特殊字符和变音符号。如何修改它以允许其他允许的字符?

2 个答案:

答案 0 :(得分:3)

您可以使用正向前瞻性来断言一个字符,并使用负向前瞻性断言不匹配字符类中列出的任何字符。

对于Javascript,您可以使用不区分大小写的标志/i并使用[a-z]

编辑:正如Wiktor Stribiżew所指出的,要仅匹配ASCII字符,可以使用[\x00-\x7F]而不是点。

^(?=.*[a-z])(?!.*[<>\\'"])[\x00-\x7F]{5,22}$
  • ^字符串的开头
  • (?=.*[a-z])前瞻,以检查是否存在ASCII字母
  • (?!.*[<>\\'"])负向查找以检查字符类中是否没有任何字符
  • [\x00-\x7F]{5,22}匹配任何ASCII字符5-22次
  • $字符串的结尾

例如:

const regex = /^(?=.*[a-z])(?!.*[<>\\'"])[\x00-\x7F]{5,22}$/gmi;

请参见regex demo

答案 1 :(得分:2)

您可以使用

/^(?=[^a-z]*[a-z])(?:(?![<>\\'"])[\x00-\x7F]){5,22}$/i
/^(?=[^a-z]*[a-z])(?![^<>\\'"]*[<>\\'"])[\x00-\x7F]{5,22}$/i

如果您的意思是允许使用可打印的ASCII字符

/^(?=[^a-z]*[a-z])(?:(?![<>\\'"])[ -~]){5,22}$/i
/^(?=[^a-z]*[a-z])(?![^<>\\'"]*[<>\\'"])[ -~]{5,22}$/i

详细信息

  • ^-字符串的开头
  • (?=[^a-z]*[a-z])-字符串中至少应包含1个ASCII字母
  • (?:(?![<>\\'"])[ -~]){5,22}-除<>\'和{{1}以外的任何可打印ASCII字符出现五至二十二次}(如果使用",则除否定字符类中的字符外的任何ASCII字符)
  • [\x00-\x7F]-字符串中不允许使用(?![^<>\\'"]*[<>\\'"])<>\'
  • "-字符串的结尾。