使用带有 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.')

Regex Demo