【问题标题】: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

如果这会有所帮助 - 我一直在测试几种解决方案,例如 ^[\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}:没有大小写变体的字母或表意文字。

不用说,我一直在测试的解决方案都没有考虑到我上面定义的所有规则..

【问题讨论】:

    标签: c# regex regex-group


    【解决方案1】:

    你可以使用

    \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")
    

    【讨论】:

    • 非常好!有用!您能否详细说明一下 - 为什么在 Web UI 中进行测试时在负前瞻中使用 \n 很重要?负前瞻不应该排除换行符,使所有行不匹配吗? (除了最后一行?)附带说明 - 我对您提供的模式做了一个小调整:\p{L}+[']? 允许单词以撇号结尾。我不确定我的申请是否应该是这种情况,但至少现在就足够了:)
    • @Alex 你可以使用'? 来匹配一个可选的撇号。在在线 Web 正则表达式测试器中进行测试时,我们使用单个多行字符串,但在现实生活中,我们将使用不带换行符的单独独立字符串,此处仅出于演示目的才需要排除 \n。与使用常规空格而不是 \s 相同。如果您确实需要确保您的模式不跨越多行,您可以继续在否定字符类中使用\n[^\t\p{Zs}] 而不是\s。不幸的是,.NET 正则表达式不支持\h
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2016-11-02
    • 2020-01-16
    相关资源
    最近更新 更多