Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配单词和短语_C#_Regex_Regex Group - Fatal编程技术网

C# 匹配单词和短语

C# 匹配单词和短语,c#,regex,regex-group,C#,Regex,Regex Group,我正在编写一个应用程序/逻辑,它将词汇词/短语作为输入参数我在为该参数的值编写验证逻辑时遇到问题 以下是我提出的规则: 最多可以是4个单词(带连字符或不带连字符) 允许使用一个撇号 只允许使用普通字母(不允许使用特殊字符,如!@$%^&*()={}[];|/>/?©等) 数字是不允许的 不区分大小写 支持多种语言(英语、俄语、挪威语等)(因此必须同时支持Unicode和西里尔语) 要么整个字符串匹配,要么什么都不匹配 少数示例(3种语言): 鉴于上面提供的预期结果,有人能给我指出如何创建这样

我正在编写一个应用程序/逻辑,它将
词汇词
/
短语
作为输入参数我在为该参数的值编写验证逻辑时遇到问题

以下是我提出的规则:

  • 最多可以是4个单词(带连字符或不带连字符)
  • 允许使用一个撇号
  • 只允许使用普通字母(不允许使用特殊字符,如!@$%^&*()={}[];|/>/?©等)
  • 数字是不允许的
  • 不区分大小写
  • 支持多种语言(英语、俄语、挪威语等)(因此必须同时支持Unicode和西里尔语)
  • 要么整个字符串匹配,要么什么都不匹配
少数示例(3种语言):

鉴于上面提供的预期结果,有人能给我指出如何创建这样的验证规则的正确方向吗?如果这很重要的话-我将在
C#
中编写验证逻辑,因此我有比
Regex
更多的工具可供使用

如果这对我有帮助的话,我已经测试了几种解决方案,比如
^[\p{Ll}\p{Lt}]+$
(?=\S*['-])([a-zA-Z'-]+)$
。第一个正则表达式似乎在允许我需要的字母(En、No和Rus)方面做得很好,而第二个规则集在使用
Lookahead
概念方面做得很好

  • \p{Ll}
    \p{Lowercase_Letter}
    :具有大写变体的小写字母
  • \p{Lu}
    \p{Uppercase\u Letter}
    :具有小写变体的大写字母
  • \p{Lt}
    \p{Titlecase\u Letter}
    :仅当单词的第一个字母大写时出现在单词开头的字母
  • \p{L&}
    \p{Letter&}
    :存在于小写和大写变体(Ll、Lu和Lt的组合)中的字母
  • \p{Lm}
    \p{Modifier\u Letter}
    :一种像字母一样使用的特殊字符
  • \p{Lo}
    \p{Other_Letter}
    :没有小写和大写变体的字母或表意文字
不用说,我测试的两个解决方案都没有考虑到我在上面定义的所有规则。

您可以使用

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

非常好!很有效!请您详细说明一下-在web UI中测试时,为什么在负前瞻中使用
\n
很重要?负前瞻不应该排除换行符,使所有行都不匹配吗?(可能最后一行除外?)另一方面,我对您提供的模式做了一个小的调整:
\p{L}+[']?
允许单词以撇号结尾。我不确定在我的应用程序中是否应该是这样,但至少现在这就足够了:)@Alex You ma使用
“?
匹配可选撇号。在在线Web正则表达式测试仪中测试时,我们使用单个多行字符串,但在现实生活中,我们将使用单独的标准字符串此处仅出于演示目的,需要使用不带换行符的单字符串(不包括
\n
)。这与使用规则空格而不是
\s
相同。如果确实需要确保模式不跨越多行,则可以在求反字符类中继续使用
\n
,并使用
[^\t\p{Zs}]
而不是
\s
。不幸的是,.NET正则表达式不支持
\h
// 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