【问题标题】:Match only Upper and Lowercase letters with Regex仅使用正则表达式匹配大小写字母
【发布时间】:2020-12-04 09:02:21
【问题描述】:

我得到一个字符串(名称),它应该检查以下内容:

  • 介于 2 到 30 个字符之间
  • 名称只能包含字母和空格
  • 每部作品的首字母大写
  • 每个单词用空格隔开
  • 名称不能以空格开头或结尾
  • 不允许特殊字符

这是我的正则表达式字符串:"[[[A-Z]{1}[a-zA-Z]*[\\s]?+]{2,30}[^\\s]"

“Roger Federer”应该是有效的,这说明它是 “罗杰费德勒”不应该是有效的,但我说它是 “Roger Federer $”应该是无效的,但我的说是

我很好奇我是否执行这些错误,我对正则表达式很陌生

【问题讨论】:

  • matches("(?=.{2,30}$)\\p{Lu}\\p{L}*(?:\\s\\p{Lu}\\p{L}*)*")
  • 为什么它必须全部在一个正则表达式中?

标签: java regex


【解决方案1】:

你可以使用

^(?=.{2,30}$)\p{Lu}\p{L}*(?:\s\p{Lu}\p{L}*)*$

如果您想在单词之间允许一个或多个空格,请在\s 之后添加+

请参阅regex demo

在 Java 中,正则表达式声明如下所示

s.matches("(?=.{2,30}$)\\p{Lu}\\p{L}*(?:\\s\\p{Lu}\\p{L}*)*")

模式匹配

  • ^ - (隐含在 matches 中) - 字符串开头
  • (?=.{2,30}$) - 整个字符串需要两到三十个字符
  • \p{Lu}\p{L}* - 一个大写字母,后跟零个或多个字母
  • (?:\s\p{Lu}\p{L}*)* - 零个或多个空格,然后是一个大写字母,然后是零个或多个字母
  • $ - (隐含在 matches 中) - 字符串结尾。

如果您只想匹配 ASCII 字母,请将 \p{Lu} 替换为 [A-Z] 并将 \p{L} 替换为 [A-Za-z]

【讨论】:

  • 是的,会的
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2011-08-29
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多