【问题标题】:Regex - Include space before only when one OR item is match正则表达式 - 仅当一个 OR 项目匹配时才包含空格
【发布时间】:2021-05-22 13:44:12
【问题描述】:

有没有办法在 Or 结构的一个项目之前包含一个空格,只有当它与其中一个匹配时?项目可以在字符串内重复。

正则表达式:

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

其中一项前的空格(必填):[(e|da|das|de|do|dos)]

我想要的结果:

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

【问题讨论】:

  • 类似regex101.com/r/LF4GC4/1 的东西?您能否澄清一下哪些字符串必须匹配,哪些必须不匹配?为什么?
  • @Wiktor Stribizew 我提交的正则表达式中有两个组:1)([A-ZÁÂÉÊÍÓÔÚ][a-záãâéêíóõôúç]+)和2)([(e|da|das|de|do |dos)]*[\s][A-ZÁÂÉÊÍÓÔÚ][a-záãâéêíóõôúç]+)+ 第一组是人名。第二组是名称的其余部分,在其他名称之前可以出现或不出现字符串“e”、“da”、“das”、“de”、“do”和“dos”,并且必须在前面有一个空格它(“e”、“da”、“das”、“de”、“do”和“dos”),就像我在最后展示的名字的例子。如果你还不明白,请告诉我. 谢谢。
  • 我发布了答案,现在似乎很清楚了。

标签: regex regex-group


【解决方案1】:

你可以使用

^\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/asa, e, o
    • \s - 一个空格
    • \p{Lu}\p{Ll}+ - 一个大写字母后跟一个或多个小写字母
  • $ - 字符串结束。

【讨论】:

  • Stribizew 您提供的第一个示例可以正常工作,但在单词之间接受多个空格。但第二个是完美的!非常感谢!!!
  • @AdalbertoJoséBrasaca 他们都只允许一个空格,\s 只匹配一个空格。见another regex demo
  • Stribizew 来自 regex101 的奇怪行为。我打开页面并在您放在那里的名称之间再插入一个空格,它接受了字符串。但是当我从一开始就输入一个名字时,它就起作用了。你是对的 !再次感谢您。
  • @AdalbertoJoséBrasaca \s 匹配换行符,这就是我在 PCRE 演示中将其替换为 \h 的原因。 \h 只匹配水平空格。
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多