使用带有 Yup 的正则表达式来验证仅包含扩展拉丁字母和至少 2 个单词的全名
Using regex with Yup to validate full name with extended latin alphabet only and a minimum of 2 words
我有一个 Reactjs 站点,我在其中使用 Formik 和 Yup 来验证注册流程中的字段。因为我不想使用日文字符或任何特殊字符,只允许使用扩展的拉丁字母表(以便用户可以使用 A-Z、a-z,但也可以使用例如 ÅÄÖÛ)。
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/gi,
'Name can only contain Latin letters.'
)
效果很好,但我还希望用户至少输入至少 2 个姓名。我知道你可以在 Yup 中链接,所以我猜另一个 .matches() 里面有一些正则表达式或一些其他 Yup 规则,但我似乎无法准确地找到我正在寻找的东西......
提前致谢! <3
更新!
这是 Phan 的回答,我可能最终会使用:###
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/gi,
'Name can only contain Latin letters.'
)
.matches(/^\s*[\S]+(\s[\S]+)+\s*$/gms, 'Please enter your full name.')
这是我发现也对我有用的另一个解决方案:
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/g,
'Name can only contain Latin letters.'
)
.matches(
/^(?:([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)) (?:([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*))$/g,
'Please enter your full name.'
)
当前正则表达式不工作的原因:
/(\w.+\s).+/gi
- 它匹配一个词
- 后跟任意字符(1 个或多个)
- 后跟一个空白字符
- 后跟任意字符(1 个或多个)
由于输入 Åäö
不包含有效的单词字符(根据正则表达式),它已经因第一条规则而失败。
Åäö Jonsson
不匹配,因为它也未通过第一条和第二条规则
Åäölam Jonsson
确实通过了正则表达式,但它只匹配以下短语:lam Jonsson
.
由于您只对检测是否有日文字符感兴趣,因此更改正则表达式以不同方式验证输入。此正则表达式将测试输入,如果字符串中有 Japanese characters (
/^[^\u4E00-\u9FBF\u3040-\u309f\u30A0-\u30FF]+$/
查看正在运行的正则表达式 here。
因为你已经匹配出非拉丁字母,所以你只需要使用非space标签\S
而不是单词标签\w
进行第二次验证。
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/gi,
'Name can only contain Latin letters.'
)
.matches(/^\s*[\S]+(\s[\S]+)+\s*$/gms,'Please enter your full name.')
我有一个 Reactjs 站点,我在其中使用 Formik 和 Yup 来验证注册流程中的字段。因为我不想使用日文字符或任何特殊字符,只允许使用扩展的拉丁字母表(以便用户可以使用 A-Z、a-z,但也可以使用例如 ÅÄÖÛ)。
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/gi,
'Name can only contain Latin letters.'
)
效果很好,但我还希望用户至少输入至少 2 个姓名。我知道你可以在 Yup 中链接,所以我猜另一个 .matches() 里面有一些正则表达式或一些其他 Yup 规则,但我似乎无法准确地找到我正在寻找的东西......
提前致谢! <3
更新!
这是 Phan 的回答,我可能最终会使用:###
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/gi,
'Name can only contain Latin letters.'
)
.matches(/^\s*[\S]+(\s[\S]+)+\s*$/gms, 'Please enter your full name.')
这是我发现也对我有用的另一个解决方案:
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/g,
'Name can only contain Latin letters.'
)
.matches(
/^(?:([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)) (?:([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*))$/g,
'Please enter your full name.'
)
当前正则表达式不工作的原因:
/(\w.+\s).+/gi
- 它匹配一个词
- 后跟任意字符(1 个或多个)
- 后跟一个空白字符
- 后跟任意字符(1 个或多个)
由于输入 Åäö
不包含有效的单词字符(根据正则表达式),它已经因第一条规则而失败。
Åäö Jonsson
不匹配,因为它也未通过第一条和第二条规则
Åäölam Jonsson
确实通过了正则表达式,但它只匹配以下短语:lam Jonsson
.
由于您只对检测是否有日文字符感兴趣,因此更改正则表达式以不同方式验证输入。此正则表达式将测试输入,如果字符串中有 Japanese characters (
/^[^\u4E00-\u9FBF\u3040-\u309f\u30A0-\u30FF]+$/
查看正在运行的正则表达式 here。
因为你已经匹配出非拉丁字母,所以你只需要使用非space标签\S
而不是单词标签\w
进行第二次验证。
.matches(
/^([A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff\s]*)$/gi,
'Name can only contain Latin letters.'
)
.matches(/^\s*[\S]+(\s[\S]+)+\s*$/gms,'Please enter your full name.')