当前位置: 首页 > 知识库问答 >
问题:

正则表达式匹配a-z空格,字符限制,只有首字母大写

孟承嗣
2023-03-14

我需要一些正则表达式的帮助。我不擅长这个。

规则:

  • 仅字母a到z和空格
  • 至少2个字母
  • 最多30个字母
  • 每个单词必须至少有两个字母
  • 每个单词的第一个字母可以是大写,但第一个字母必须总是大写

我的尝试:

^[A-Z][a-z]{2,30}$

我在PHP中使用它。

共有2个答案

曹光霁
2023-03-14

让我们试试这个:

^[A-Z]((?<= )[A-Z]|[a-z ]){2,29}$
[A-Z]          -- a capital letter
(
  (?<= )[A-Z]  -- either a capital letter preceded by a space
  |            -- or 
  [a-z ]       -- a lowercase letter or a space
){2,29}  -- 2 to 29 times (plus the initial capital)

您需要使用PCRE(而不是ereg.*)才能使lookback工作。

"My name Is bob"
   ↑  ↑  ↑
   |  |  \-- this is a "(?<= )[A-Z]"
   |  \--- this is a "[a-z]"
   \---- this is a "[ ]"


"naMe"
   ↑
   \-- this is NOT a "(?<= )[A-Z]" (a character before the [A-Z] is not a space)

编辑:该死,你加了“每个单词必须至少有2个字母”。使用m.buettner

郑茂勋
2023-03-14

好的,让我们先尝试解决需求1到3。如果你的意思是2到30个字符,那么就这么简单:

^[a-zA-Z ]{2,30}$

现在是其他要求。让我们自己来处理。第4点要求每个单词的格式[a-zA-Z][a-Z]*。为了确保每个单词至少有两个字母,我们可以简单地将*转换为(这意味着一次或多次重复)。如果我们在其周围插入显式空格,则可以确保[a-z]后面不能紧跟大写字母:

^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$

注意,我单独处理了第一个单词。

最后,我们如何将两者结合起来?通过把一个放在前瞻中。我将在这里进行计数:

^(?=[a-zA-Z ]{2,30}$)[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$

这是因为,在对照前瞻检查输入后,引擎将其“光标”重置到其开始的位置(字符串的开头),并像往常一样继续匹配。这样,我们可以在输入上运行两个过程,检查独立条件。

最后,请注意,前瞻性要求只是转换为字符串的长度。在这种情况下,更容易(通常更好)单独检查:

$len = strlen($input)
if ($len < 2 || $len > 30)
    // report error about string length
else if (!preg_match('/^[A-Z][a-z]+(?:[ ]+[a-zA-Z][a-z]+)*$/', $input))
    // report error about pattern
else
    // process input

这使得根据违反了哪个条件给出合理的错误消息变得更加容易。

 类似资料:
  • 我需要在以下条件下使用C#中的正则表达式匹配字符串: 整个字符串只能是字母数字(包括空格) 最大长度不得超过15个字符(包括空格) 首先 如果这些先决条件中的任何一个被打破,比赛就不会进行。 以下是我目前掌握的情况: 下面是一些应该匹配的测试字符串: 堆栈溢出 伊姆特最伟大的 一个 超人23s 一二三 还有一些不应该匹配的(注意空格): 堆叠 [double_space] 溢流岩石 23你好 这是

  • 问题内容: 我正在寻找Java中与字符串中所有空白字符匹配的正则表达式。“ \ s”仅匹配一些,不匹配和类似的非ASCII空格。我正在寻找与Java字符串中可能出现的所有(常见)空白字符匹配的正则表达式。 [编辑] 需要说明的是:我不是指字符串序列“ ”我是指通常用“ ” 表示的单个Unicode字符U + 00A0 ,例如在HTML中,以及所有其他具有类似空格的unicode字符,例如“ NAR

  • 我试图匹配包含字母数字、连字符、下划线和空格的字符串。 连字符、下划线、空格和数字是可选的,但第一个和最后一个字符必须是字母。 例如,这些都应该匹配: 我试过这个: 但它在开始/结束时与空格、下划线或连字符匹配,但它应该只允许在两者之间。

  • 其中,我需要包括连字符和空格。 这意味着还必须可以输入值“”。

  • 问题内容: 我需要将Python中的一个表达式与仅匹配偶数个字母出现的正则表达式进行匹配。例如: 偶数应匹配。 问题答案: 试试这个正则表达式: 并且如果s不需要是连续的:

  • 我正在尝试匹配这个片段中的“Б.Γ”。通常,首字母应该没有空格,所以我需要一个可以解释可选空格的正则表达式。 我一直在使用: 但是好像和这个不太对。我不确定为什么。注意,我在java中的“s”和“s”之前键入< code>\\。有人能发现错误吗?