正则表达式和是的:允许某个特殊字符,但不能重复

Regex and yup: Allow a certain special character, but it can't be repeated

我有一个带有正则表达式的 yup 验证器,允许以下所有字符:

Yup.string()
  .required(MESSAGES.requiredField)
  .min(min, MESSAGES.minCharacters(min))
  .matches(
    /^([a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð '])+$/u,
    'Insert only normal character'
  ),

唯一允许的特殊字符是“'”,单引号。但我还需要验证用户是否重复输入该字符,如果是,我需要阻止该表单。

在这种情况下,表格允许:Vinicius Sant'anna

但如果用户输入:“Vinicius Sant''''''anna”,我需要阻止。我怎样才能改进我的正则表达式来验证这种情况?

您可以使用

/^'?\p{L}+(?:[' ]\p{L}+)*'?$/u

详情:

  • ^ - 字符串开头
  • '? - 一个可选的前导 '
  • \p{L}+ - 一个或多个 Unicode 字母
  • (?:[' ]\p{L}+)* - ' 或 space 出现零次或多次,然后出现一个或多个字母
  • '? - 一个可选的 ' 字符
  • $ - 字符串结尾
  • u - 在正则表达式中启用 Unicode 属性 类。

如果您还需要支持变音符号,请使用

/^'?(?:\p{L}\p{M}*)+(?:['\s](?:\p{L}\p{M}*)+)*'?$/u

其中 (?:\p{L}\p{M}*)+ 匹配一个或多个字母,然后匹配零个或多个变音符号。 \s 匹配白色space.