匹配词汇单词和短语

Match vocabulary words and phrases

我正在写一个 application/logic,它有 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 概念方面做得很好。

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

您可以使用

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