使用正则表达式和Yup来验证仅使用扩展拉丁字母表和至少2个单词的全名



我有一个Reactjs站点,在那里我使用Formik和Yup来验证注册流中的字段。由于我不想允许使用日语字符或任何特殊字符,只允许使用扩展的拉丁字母表(这样用户可以使用A-Z、A-Z,但也可以使用例如ÅÖÛ(。

.matches(
/^([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs]*)$/gi,
'Name can only contain Latin letters.'
)

这很好,但我也希望用户至少输入2个名称。我知道你可以在Yup中链接,所以我猜是另一个.matches((,里面有一些正则表达式或其他Yup规则,但我似乎找不到我想要的东西。。。

提前感谢<3

更新

这是潘的答案,我可能最终会使用:###

.matches(
/^([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs]*)$/gi,
'Name can only contain Latin letters.'
)
.matches(/^s*[S]+(s[S]+)+s*$/gms, 'Please enter your full name.')

这是我发现的另一个对我也有效的解决方案:

.matches(
/^([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs]*)$/g,
'Name can only contain Latin letters.'
)
.matches(
/^(?:([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs]*)) (?:([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs]*))$/g,
'Please enter your full name.'
)

因为您已经匹配出非拉丁字母,所以第二次验证只需要使用非空格标记S,而不需要使用单词标记w

.matches(
/^([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs]*)$/gi,
'Name can only contain Latin letters.'
)
.matches(/^s*[S]+(s[S]+)+s*$/gms,'Please enter your full name.')

Regex演示

当前正则表达式不起作用的原因:

/(w.+s).+/gi
  • 它匹配一个单词
  • 后跟任意字符(1个或多个(
  • 后面跟一个空白字符
  • 后跟任意字符(1个或多个(

由于输入Åäö不包含有效的单词字符(根据regex(,因此由于第一条规则,它已经失败。

Åäö Jonsson不匹配,因为它也未通过第一和第二规则

Åäölam Jonsson确实传递正则表达式,但它仅在以下短语上匹配:lam Jonsson

由于您只对检测是否有日语字符感兴趣,请更改正则表达式以不同方式验证输入。此正则表达式将测试输入,如果字符串中有日语字符(

/^[^u4E00-u9FBFu3040-u309fu30A0-u30FF]+$/

请参阅此处的regex。

上述解决方案不适用于连字符的名字或名字中有撇号的贫穷的爱尔兰和意大利人等。命名中可能还有其他一些小的奇怪之处需要添加,但这些都是显而易见的。

我添加了对连字符和撇号的支持。。。您可以做更多的操作来限制它们在名称中的位置和数量,但这只是表明它们是合法字符。

此外,"*"表示0个或更多匹配项,可能您打算使用"+"1个或更多的匹配字符。

const latinCharsRegEx = /^([A-Za-zu00C0-u00D6u00D8-u00f6u00f8-u00ffs'-]*)$/gi;

相关内容

最新更新