匹配称呼的正则表达式
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 Doe
或 Mr. 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))
我使用了以下正则表达式:
[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 Doe
或 Mr. 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))