正则表达式 - 仅当一个或项匹配时才在前面包含 space

Regex - Include space before only when one OR item is match

有没有办法在 Or 结构的项目之前包含一个 space 仅当与其中之一匹配时?这些项目可以在字符串中重复。

正则表达式:

^([A-ZÁÂÉÊÍÓÔÚ][a-záãâéêíóõôúç]+)([(e|da|das|de|do|dos)]*[\s][A-ZÁÂÉÊÍÓÔÚ][a-záãâéêíóõôúç]+)+$

Space 在其中一项之前(必填):[(e|da|das|de|do|dos)]

我想要的结果:

Paulo César Oliveira(有效)
Antonio Carlos da Silva (“da”前必须有一个 space)
João da Silva dos Santos e Souza (在“da”、“dos”和“e”之前必须有一个 space

你可以使用

^\p{Lu}\p{Ll}+(?:(?:\s(?:e|d(?:[ao]s|[aeo])))?\s\p{Lu}\p{Ll}+)+$
^[A-ZÁÂÉÊÍÓÔÚ][a-záãâéêíóõôúç]+(?:(?:\s(?:e|d(?:[ao]s|[aeo])))?\s[A-ZÁÂÉÊÍÓÔÚ][a-záãâéêíóõôúç]+)+$

参见regex demo\p{Lu}\p{Ll} 可能不受您的正则表达式引擎的支持,然后继续使用您的字符 类。

详情:

  • ^ - 字符串开头
  • \p{Lu}\p{Ll}+ - 一个大写字母后跟一个或多个小写字母
  • (?:(?:\s(?:e|d(?:[ao]s|[aeo])))?\s\p{Lu}\p{Ll}+)+ - 以下模式出现一次或多次:
    • (?:\s(?:e|d(?:[ao]s|[aeo])))? - 可选出现:
      • \s - 一个空格
      • (?:e|d(?:[ao]s|[aeo])) - ed 后跟 os/asaeo
    • \s - 一个空格
    • \p{Lu}\p{Ll}+ - 一个大写字母后跟一个或多个小写字母
  • $ - 字符串结尾。