6

我需要在 C# 中使用 Regex 在以下条件下匹配字符串:

  1. 整个字符串只能是字母数字(包括空格)。
  2. 最多不得超过 15 个字符(包括空格)。
  3. 第一个和最后一个字符只能是一个字母。
  4. 除了字符串的第一个和最后一个字符之外,一个空格可以在任何地方出现多次。(不应允许多个空格一起使用)。
  5. 应该忽略大小写。
  6. 应该匹配整个单词。

如果这些先决条件中的任何一个被破坏,则不应遵循匹配。

这是我目前拥有的:

^\b([A-z]{1})(([A-z0-9 ])*([A-z]{1}))?\b$

以下是一些应该匹配的测试字符串:

  • 堆栈溢出
  • 我是最棒的
  • 一个
  • 超人23s
  • 一二三

还有一些不应该匹配的(注意空格):

  • 堆栈 [double_space] 溢出岩石
  • 23你好
  • 这是超过 15 个字符长
  • 你好23
  • [space_here]嘿

等等

任何建议将不胜感激。

4

3 回答 3

5

你应该使用lookaheads

                                                               |->matches if all the lookaheads are true
                                                               --
^(?=[a-zA-Z]([a-zA-Z\d\s]+[a-zA-Z])?$)(?=.{1,15}$)(?!.*\s{2,}).*$
-------------------------------------- ----------  ----------
                 |                       |           |->checks if there are no two or more space occuring
                 |                       |->checks if the string is between 1 to 15 chars
                 |->checks if the string starts with alphabet followed by 1 to many requireds chars and that ends with a char that is not space

你可以在这里试试

于 2012-11-30T10:31:16.253 回答
3

试试这个正则表达式: -

"^([a-zA-Z]([ ](?=[a-zA-Z0-9])|[a-zA-Z0-9]){0,13}[a-zA-Z])$"

解释 : -

[a-zA-Z]    // Match first character letter

(                         // Capture group
    [ ](?=[a-zA-Z0-9])    // Match either a `space followed by non-whitespace` (Avoid double space, but accept single whitespace)
            |             // or
    [a-zA-Z0-9]           // just `non-whitespace` characters

){0,13}                  // from `0 to 13` character in length

[a-zA-Z]     // Match last character letter

更新 : -

要处理单个字符,您可以将第一个字符之后的模式设为可选,正如@Rawling注释中所指出的那样:-

"^([a-zA-Z](([ ](?=[a-zA-Z0-9])|[a-zA-Z0-9]){0,13}[a-zA-Z])?)$"
         ^^^                                            ^^^
     use a capture group                           make it optional
于 2012-11-30T10:47:09.150 回答
0

而我的版本,再次使用前瞻:

^(?=.{1,15}$)(?=^[A-Z].*)(?=.*[A-Z]$)(?![ ]{2})[A-Z0-9 ]+$

解释:

^               start of string
(?=.{1,15}$)    positive look-ahead: must be between 1 and 15 chars
(?=^[A-Z].*)    positive look-ahead: initial char must be alpha
(?=.*[A-Z]$)    positive look-ahead: last char must be alpha
(?![ ]{2})      negative look-ahead: string mustn't contain 2 or more consecutive spaces
[A-Z0-9 ]+      if all the look-aheads agree, select only alpha-numeric chars + space
$               end of string

这也需要 IgnoreCase 选项设置

于 2012-11-30T11:34:29.793 回答