首页 > 解决方案 > 匹配词汇单词和短语

问题描述

我正在编写一个具有vocabulary word/phrase作为输入参数的应用程序/逻辑。我在为这个参数的值编写验证逻辑时遇到了麻烦

以下是我想出的规则:

几个例子(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概念方面做得很好。

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

标签: c#regexregex-group

解决方案


您可以使用

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

推荐阅读