C# 匹配单词和短语
我正在编写一个应用程序/逻辑,它将C# 匹配单词和短语,c#,regex,regex-group,C#,Regex,Regex Group,我正在编写一个应用程序/逻辑,它将词汇词/短语作为输入参数我在为该参数的值编写验证逻辑时遇到问题 以下是我提出的规则: 最多可以是4个单词(带连字符或不带连字符) 允许使用一个撇号 只允许使用普通字母(不允许使用特殊字符,如!@$%^&*()={}[];|/>/?©等) 数字是不允许的 不区分大小写 支持多种语言(英语、俄语、挪威语等)(因此必须同时支持Unicode和西里尔语) 要么整个字符串匹配,要么什么都不匹配 少数示例(3种语言): 鉴于上面提供的预期结果,有人能给我指出如何创建这样
词汇词
/短语
作为输入参数我在为该参数的值编写验证逻辑时遇到问题
以下是我提出的规则:
- 最多可以是4个单词(带连字符或不带连字符)
- 允许使用一个撇号
- 只允许使用普通字母(不允许使用特殊字符,如!@$%^&*()={}[];|/>/?©等)
- 数字是不允许的
- 不区分大小写
- 支持多种语言(英语、俄语、挪威语等)(因此必须同时支持Unicode和西里尔语)
- 要么整个字符串匹配,要么什么都不匹配
C#
中编写验证逻辑,因此我有比Regex
更多的工具可供使用
如果这对我有帮助的话,我已经测试了几种解决方案,比如^[\p{Ll}\p{Lt}]+$
和(?=\S*['-])([a-zA-Z'-]+)$
。第一个正则表达式似乎在允许我需要的字母(En、No和Rus)方面做得很好,而第二个规则集在使用Lookahead
概念方面做得很好
或\p{Ll}
:具有大写变体的小写字母\p{Lowercase_Letter}
或\p{Lu}
:具有小写变体的大写字母\p{Uppercase\u Letter}
或\p{Lt}
:仅当单词的第一个字母大写时出现在单词开头的字母\p{Titlecase\u Letter}
或\p{L&}
:存在于小写和大写变体(Ll、Lu和Lt的组合)中的字母\p{Letter&}
或\p{Lm}
:一种像字母一样使用的特殊字符\p{Modifier\u Letter}
或\p{Lo}
:没有小写和大写变体的字母或表意文字\p{Other_Letter}
\A(?)(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+{0,3}\z
看。详情:
-字符串的开头\A
-字符串不能包含两个撇号(?!(?:[^']*'){2}
-一个或多个Unicode字母\p{L}+
-零到三次(?:[\s'-]\p{L}+{0,3}
-空白、[\s'-]
或'
字符-
-一个或多个Unicode字母\p{L}+
-字符串的末尾\z
var IsValid=Regex.IsMatch(text,@“\A(?)(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+”;{0,3}\z”)
非常好!很有效!请您详细说明一下-在web UI中测试时,为什么在负前瞻中使用\n
很重要?负前瞻不应该排除换行符,使所有行都不匹配吗?(可能最后一行除外?)另一方面,我对您提供的模式做了一个小的调整:\p{L}+[']?
允许单词以撇号结尾。我不确定在我的应用程序中是否应该是这样,但至少现在这就足够了:)@Alex You ma使用“?
匹配可选撇号。在在线Web正则表达式测试仪中测试时,我们使用单个多行字符串,但在现实生活中,我们将使用单独的标准字符串此处仅出于演示目的,需要使用不带换行符的单字符串(不包括\n
)。这与使用规则空格而不是\s
相同。如果确实需要确保模式不跨越多行,则可以在求反字符类中继续使用\n
,并使用[^\t\p{Zs}]
而不是\s
。不幸的是,.NET正则表达式不支持\h
。
// 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