匹配词汇单词和短语
Posted
技术标签:
【中文标题】匹配词汇单词和短语【英文标题】:Match vocabulary words and phrases 【发布时间】:2021-05-11 07:58:39 【问题描述】:我正在编写一个以vocabulary word
/phrase
作为输入参数的应用程序/逻辑。 我在为此参数的值编写验证逻辑时遇到问题!
以下是我想出的规则:
最多可包含 4 个单词(带或不带连字符) 允许使用一个撇号 只允许使用常规字母(不允许使用特殊字符,例如 !@#$%^&*()=[]"";|/>/?¶ © 等) 不允许使用数字 不区分大小写 支持多种语言(英语、俄语、挪威语等)(因此必须同时支持 Unicode 和西里尔文) 整个字符串匹配或不匹配几个例子(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
。
如果这会有所帮助 - 我一直在测试几种解决方案,例如 ^[\pLl\pLt]+$
和 (?=\S*['-])([a-zA-Z'-]+)$
。第一个正则表达式似乎做得很好,只允许我需要的字母(En、No 和 Rus),而第二个规则集在使用 Lookahead
概念方面做得很好。
\pLl
或 \pLowercase_Letter
:带有大写变体的小写字母。
\pLu
或 \pUppercase_Letter
:带有小写变体的大写字母。
\pLt
或 \pTitlecase_Letter
:当单词的首字母大写时出现在单词开头的字母。
\pL&
或 \pLetter&
:以小写和大写形式存在的字母(Ll、Lu 和 Lt 的组合)。
\pLm
或 \pModifier_Letter
:一个像字母一样使用的特殊字符。
\pLo
或 \pOther_Letter
:没有大小写变体的字母或表意文字。
不用说,我一直在测试的解决方案都没有考虑到我上面定义的所有规则..
【问题讨论】:
【参考方案1】:你可以使用
\A(?!(?:[^']*')2)\pL+(?:[\s'-]\pL+)0,3\z
请参阅regex demo。 详情:
\A
- 字符串开头
(?!(?:[^']*')2)
- 字符串不能包含两个撇号
\pL+
- 一个或多个 Unicode 字母
(?:[\s'-]\pL+)0,3
- 零到三次出现
[\s'-]
- 一个空格,'
或 -
char
\pL+
- 一个或多个 Unicode 字母
\z
- 字符串的最后。
在 C# 中,您可以将其用作
var IsValid = Regex.IsMatch(text, @"\A(?!(?:[^']*')2)\pL+(?:[\s'-]\pL+");0,3\z")
【讨论】:
非常好!有用!您能否详细说明一下 - 为什么在 Web UI 中进行测试时在负前瞻中使用\n
很重要?负前瞻不应该排除换行符,使所有行不匹配吗? (除了最后一行?)附带说明 - 我对您提供的模式做了一个小调整:\pL+[']?
允许单词以撇号结尾。我不确定我的申请是否应该是这种情况,但至少现在就足够了:)
@Alex 你可以使用'?
来匹配一个可选的撇号。在在线 Web 正则表达式测试器中进行测试时,我们使用单个多行字符串,但在现实生活中,我们将使用不带换行符的单独独立字符串,此处仅出于演示目的才需要排除 \n
。与使用常规空格而不是 \s
相同。如果您确实需要确保您的模式不跨越多行,您可以继续在否定字符类中使用\n
和[^\t\pZs]
而不是\s
。不幸的是,.NET 正则表达式不支持\h
。以上是关于匹配词汇单词和短语的主要内容,如果未能解决你的问题,请参考以下文章