匹配词汇单词和短语
Match vocabulary words and phrases
我正在写一个 application/logic,它有 vocabulary word
/phrase
作为输入参数。 我在为此参数值编写验证逻辑时遇到问题!
以下是我想出的规则:
- 最多 4 个单词(带连字符或不带连字符)
- 允许一个撇号
- 只允许使用常规字母(不允许使用 !@#$%^&*()={}[]";|/>/? ¶ © 等特殊字符)
- 不允许使用数字
- 不区分大小写
- 多语言支持(英语、俄语、挪威语等)(因此必须同时支持 Unicode 和 Cyrillic)
- 整个字符串匹配或什么都不匹配
几个例子(3 种语言):
// match:
one two three four
one-two-three-four
one-two-three four
vær så snill
тест регекс
re-read
under the hood
ONe
rabbit's lair
// not-match:
one two three four five
one two three four@
one-two-three-four five
rabbit"s lair
one' two's
one1
1900
鉴于上面提供的预期结果 - 有人可以为我指明正确的方向,说明如何创建这样的验证规则吗?如果这很重要 - 我将在 C#
中编写验证逻辑,这样我就有了更多的工具,而不仅仅是 Regex
可供我使用。
如果这会有所帮助 - 我一直在测试几种解决方案,例如 ^[\p{Ll}\p{Lt}]+$
和 (?=\S*['-])([a-zA-Z'-]+)$
。第一个正则表达式似乎做得很好,只允许我需要的字母(En、No 和 Rus),而第二个规则集在使用 Lookahead
概念方面做得很好。
\p{Ll}
或 \p{Lowercase_Letter}
:具有大写变体的小写字母。
\p{Lu}
或 \p{Uppercase_Letter}
:具有小写变体的大写字母。
\p{Lt}
或\p{Titlecase_Letter}
:当单词首字母大写时出现在单词开头的字母。
\p{L&}
或\p{Letter&}
:存在小写和大写变体(Ll、Lu和Lt的组合)的字母。
\p{Lm}
或\p{Modifier_Letter}
: 像字母一样使用的特殊字符。
\p{Lo}
或 \p{Other_Letter}
: 没有小写和大写变体的字母或表意文字。
不用说,我一直在测试的解决方案都没有考虑到我在上面定义的所有规则..
您可以使用
\A(?!(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+){0,3}\z
见regex demo。 详情:
\A
- 字符串开头
(?!(?:[^']*'){2})
- 字符串不能包含两个撇号
\p{L}+
- 一个或多个 Unicode 字母
(?:[\s'-]\p{L}+){0,3}
- 出现零到三次
[\s'-]
- 空格,'
或 -
char
\p{L}+
- 一个或多个 Unicode 字母
\z
- 字符串的末尾。
在 C# 中,您可以将其用作
var IsValid = Regex.IsMatch(text, @"\A(?!(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+");{0,3}\z")
我正在写一个 application/logic,它有 vocabulary word
/phrase
作为输入参数。 我在为此参数值编写验证逻辑时遇到问题!
以下是我想出的规则:
- 最多 4 个单词(带连字符或不带连字符)
- 允许一个撇号
- 只允许使用常规字母(不允许使用 !@#$%^&*()={}[]";|/>/? ¶ © 等特殊字符)
- 不允许使用数字
- 不区分大小写
- 多语言支持(英语、俄语、挪威语等)(因此必须同时支持 Unicode 和 Cyrillic)
- 整个字符串匹配或什么都不匹配
几个例子(3 种语言):
// match:
one two three four
one-two-three-four
one-two-three four
vær så snill
тест регекс
re-read
under the hood
ONe
rabbit's lair
// not-match:
one two three four five
one two three four@
one-two-three-four five
rabbit"s lair
one' two's
one1
1900
鉴于上面提供的预期结果 - 有人可以为我指明正确的方向,说明如何创建这样的验证规则吗?如果这很重要 - 我将在 C#
中编写验证逻辑,这样我就有了更多的工具,而不仅仅是 Regex
可供我使用。
如果这会有所帮助 - 我一直在测试几种解决方案,例如 ^[\p{Ll}\p{Lt}]+$
和 (?=\S*['-])([a-zA-Z'-]+)$
。第一个正则表达式似乎做得很好,只允许我需要的字母(En、No 和 Rus),而第二个规则集在使用 Lookahead
概念方面做得很好。
\p{Ll}
或\p{Lowercase_Letter}
:具有大写变体的小写字母。\p{Lu}
或\p{Uppercase_Letter}
:具有小写变体的大写字母。\p{Lt}
或\p{Titlecase_Letter}
:当单词首字母大写时出现在单词开头的字母。\p{L&}
或\p{Letter&}
:存在小写和大写变体(Ll、Lu和Lt的组合)的字母。\p{Lm}
或\p{Modifier_Letter}
: 像字母一样使用的特殊字符。\p{Lo}
或\p{Other_Letter}
: 没有小写和大写变体的字母或表意文字。
不用说,我一直在测试的解决方案都没有考虑到我在上面定义的所有规则..
您可以使用
\A(?!(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+){0,3}\z
见regex demo。 详情:
\A
- 字符串开头(?!(?:[^']*'){2})
- 字符串不能包含两个撇号\p{L}+
- 一个或多个 Unicode 字母(?:[\s'-]\p{L}+){0,3}
- 出现零到三次[\s'-]
- 空格,'
或-
char\p{L}+
- 一个或多个 Unicode 字母
\z
- 字符串的末尾。
在 C# 中,您可以将其用作
var IsValid = Regex.IsMatch(text, @"\A(?!(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+");{0,3}\z")