c# - 匹配词汇单词和短语
问题描述
我正在编写一个具有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&}
or\p{Letter&}
:以小写和大写变体形式存在的字母(Ll、Lu 和 Lt 的组合)。\p{Lm}
or\p{Modifier_Letter}
: 一个像字母一样使用的特殊字符。\p{Lo}
or\p{Other_Letter}
:没有小写和大写变体的字母或表意文字。
不用说,我一直在测试的解决方案都没有考虑到我上面定义的所有规则。
解决方案
您可以使用
\A(?!(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+){0,3}\z
请参阅正则表达式演示。详情:
\A
- 字符串的开始(?!(?:[^']*'){2})
- 字符串不能包含两个撇号\p{L}+
- 一个或多个 Unicode 字母(?:[\s'-]\p{L}+){0,3}
- 零到三个出现[\s'-]
- 空格'
或-
字符\p{L}+
- 一个或多个 Unicode 字母
\z
- 字符串的最后。
在 C# 中,您可以将其用作
var IsValid = Regex.IsMatch(text, @"\A(?!(?:[^']*'){2})\p{L}+(?:[\s'-]\p{L}+");{0,3}\z")
推荐阅读
- wpf - 如何处理点击事件然后传递给WPF中的底层应用程序
- c# - Delphi 到 C# 通过(未注册的)COM 互操作性示例?
- javascript - 如何为样式组件的组合制作接口?
- metrics - 对千分尺指标的困惑 - 仪表不应该在提交之前自动计算值吗?
- javascript - 从对象Javascript数组返回键值
- c - 提交给 linux workqueue 的工作可以自行调度吗
- android - 如何让 exoplayer 播放云端硬盘中的视频
- r - R中的for循环无法正确输出
- spring - Tomcat 在一定数量的字符后向请求正文添加换行符?
- elasticsearch - ElasticSearch Search-as-you-type field type field with partial search