匹配称呼的正则表达式

Regular Expression to match Salutation

我使用了以下正则表达式:

[RegularExpression(@"^(Mr. .*|MR. .*|MRS. .*|Mrs. .*|MS. .*|Ms. .*|DR. .*|Dr. .*)", ErrorMessage = "Greeting must begin with Mr., Mrs., Ms., or Dr. and be followed by a name.")]
 public string? Greeting { get; set; }

如何强制用户在 Mr.MR.MRs.Mrs. 之后输入 space,然后在 space.

例如:如果他们输入 Mr. Joe DoeMr. Joe 是有效的,但他们输入 Mr. 且只有 space 或 Mr. 而没有 space 无效。

几个问题

. 匹配“任何字符”所以说 Mr. 允许某人写 Mra Mrb 等 - 在它前面放一个 \ 或放它在字符 class 中(用 [ ] 包围)

* 表示“零个或多个”,因此 Mr. .* 的正则表达式允许他们为名称写入零个字符。为了量化“一个或多个”,我们使用 + 而不是 *

如果你想去掉重复的元素,你可以

(M[rRsS]|M(RS|rs)|D[rR])\. \w+

第一个照顾Mr和Ms,第二个照顾Mrs,第三个Dr,然后是“字面上一个句号”的公共元素后面跟着一串单词字符

尝试将每个 * 替换为 +

^(Mr. .+|MR. .+|MRS. .+|Mrs. .+|MS. .+|Ms. .+|DR. .+|Dr. .+)

我相信这会有所帮助。

您可以尝试这样的方式开始

^[Mr\.]+[ ]+[A-Za-z]{0,25}[ ]?[A-za-z]{1,25}

这应该与您提供的用例相匹配。

反斜杠转义了句点,因此它与文字句点匹配。

大括号给出了它之前的分组允许的模式数量的范围。

问号使前面的括号分组可选。

另外,试试这个网站,实时试用您的正则表达式。 https://regexr.com/

使用

^(?:[DM][rR][sS]?|M[Ss])\. .+

参见proof

解释

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (?:                      group, but do not capture:
--------------------------------------------------------------------------------
    [DM]                     any character of: 'D', 'M'
--------------------------------------------------------------------------------
    [rR]                     any character of: 'r', 'R'
--------------------------------------------------------------------------------
    [sS]?                    any character of: 's', 'S' (optional
                             (matching the most amount possible))
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    M                        'M'
--------------------------------------------------------------------------------
    [Ss]                     any character of: 'S', 's'
--------------------------------------------------------------------------------
  )                        end of grouping
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
                           ' '
--------------------------------------------------------------------------------
  .+                       any character except \n (1 or more times
                           (matching the most amount possible))