匹配词汇单词和短语

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

以上是关于匹配词汇单词和短语的主要内容,如果未能解决你的问题,请参考以下文章

高三英语词汇哪里可下载?

词汇精选:border的用法和辨析

TPO1-48口语实用手册(文本词汇+短语)

spaCy:词汇中的单词

大学英语四级单词词汇都有哪些

求高中英语所有常用词组