2

我需要使用正则表达式匹配一个字符串,其中单引号

  1. 可以出现零次或一次
  2. 不应位于字符串的开头或结尾
  3. 前面应该至少有一个字母(如果出现单引号)

字符串的最小长度应为 2,最大长度不应超过 25 个字符
最多可以有两个空格

我从以下问题中获得了一些帮助,关于只出现一个字符(在我的例子中是一个单引号)

Javascript正则表达式仅匹配一次出现,不多也不少

并想出了这个

^([^']([a-zA-Z])+(\s){0,1})+('){0,1}([a-zA-Z][^'])+$

正则表达式可视化

在 Debuggex 上实时编辑

应该匹配的示例字符串

  • 香农·德科斯塔
  • 香农梅修斯
  • RCS
  • J德科斯塔

不应匹配的示例字符串

  • ''香农·德科斯塔
  • ''香农·德科斯塔
  • Shanon Dcosta(Shanon 之前的空格或 Dcosta 之后的空格)
  • 香农·德科斯塔''
  • 香农·劳伦斯·詹姆斯·德科斯塔
  • 香农科斯塔

问题:

  1. 我的正则表达式匹配以空格开头的字符串
  2. 它不匹配 shanon d'cos 和 shanon d'costa但匹配 shanon d'cost
  3. 最多 25 个字符也不起作用

任何有关此的帮助/建议将不胜感激。

编辑 2013 年 9 月 12 日
字符串不应包含除单引号和空格外的特殊字符

4

2 回答 2

4

I'm using lookahead to check the conditions on their own:

/^(?=[a-z ']{2,25}$)(?=(?:\S+\s){0,2}\S*$)(?:[^']*|[^']*?[a-z]'[^']+)$/i

^                      # from start of string
(?=[a-z ']{2,25}$)     # 2 to 25 of the allowed chars until end of string
(?=(?:\S+\s){0,2}\S*$) # at most two spaces until end of string
(?:                    # either
 [^']*                 # no apostrophe
|                      # or
 [^']*?[a-z]'[^']+     # exactly one apostrophe preceded by alphabet letter
)$                     # to end of string

But they better be separated in code. So use

str.length >= 2 && str.length <= 25
 && /^(?:\S+\s){0,2}\S*$/.test(str)
 && /^[a-z ]*(?:[a-z]')?[a-z ]+$/i.test(str)
于 2013-09-12T15:03:00.930 回答
0

使用前瞻来断言引用用法和整体大小的简单重复:

^(?=([^']*[a-zA-Z]')?[^']+$).{2,25}$

查看一个使用给出的所有示例正确工作的现场演示。

于 2013-09-12T14:58:17.833 回答