Javascript正则表达式的困难

时间:2011-08-17 00:58:04

标签: javascript regex

我正在尝试将字符串与以下内容匹配:

我一直在尝试以下方法:

new RegExp(/^[A-Z](?!.*[- ']$).*[a-zA-Z- '\u00E0-\u00EF]$/);

我的问题不在于我无法理解正则表达式的作用,而是它们是否正确。 编写一个看起来应该可以正常运行的正则表达式是非常容易的(或者不是这样)。

非常感谢任何帮助。

修改

有效字符串:Marie-Noëlle TranchantJean-François Copé ...

4 个答案:

答案 0 :(得分:3)

/^[A-Z](?:[- ']?[a-zA-Z\u00E0-\u00EF])+$/

以下是为什么符合您的标准的证明。如果您将非捕获组(?:...)更改为(...),那么它也是符合您标准的最短正则表达式。

  

以[A-Z]

开头

因为^[A-Z]

  

包含[a-zA-Z-'\ u00E0- \ u00EF](Latin-1补充 - 匹配Unicode块范围)   禁止任何其他角色

因为整个事物必须匹配仅包含那些字符的字符集

  

不以[ - ']结尾或[ - ']彼此相邻。

因为[- ']每次出现[a-zA-Z\u00E0-\u00EF]

[A-Z]被限制为零或一次
  

至少有2个字符

因为+至少匹配一个字符而(?:...)组之后的{{1}}需要另一个字符。

答案 1 :(得分:1)

测试正则表达式的一种非常基本的方法是采用文字字符串,例如“blah this is text”并使用.match方法。您可以打开一个js控制台(Chrome中的Ctrl + Shift + J)并直接运行它以查看它返回的内容

"Marie-Noëlle Tranchant".match(/^[A-Z][-a-zA-Z '\u00E0-\u00EF]*[^- ']$/);

答案 2 :(得分:1)

我认为你的正则表达式不会做你想要的。它应该接受以[A-Z]开头并以[a-zA-Z\u00E0-\u00EF]结尾的任何字符串(中间包含任何字符,包括您不想接受的字符),尽管我不能肯定地说不知道如何处理未转义的' - '......

我想你想要更像这样的东西:

new RegExp(/^[A-Z](?:(?!--|''|  )[a-zA-Z\- '\u00E0-\u00EF])*[a-zA-Z\u00E0-\u00EF]$/);

答案 3 :(得分:1)

编辑 - 重做
重新访问这个帖子后,我注意到了这些评论:

“没有[ - ']彼此相邻”这里所有9种可能性或者只有三种  同一个角色加倍了吗? - jswolf19 2天前
 @ jswolf19没有:'space''space'--''。 - Stack 101 2天前

鉴于此,你必须选择@ jswolf19所做的事。

他的正则表达式可能会被简化一点:

PCRE:
/^[A-Z](?:([\- '])(?!$|\1)|[a-zA-Z\x{E0}-\x{EF}])+$/

JS:
/^[A-Z](?:([\- '])(?!$|\1)|[a-zA-Z\u00E0-\u00EF])+$/

expanded JavaScript:  
^                     # start of string
   [A-Z]                     # single A-Z char
   (?:                       # non-capture group
       ([\- '])                   # capture group 1, single char from: [- ']
       (?! $ | \1 )               # not the end of string nor the
                                  #   char captured in group 1 (backreference)
     |                          # OR,
       [a-zA-Z\u00E0-\u00EF]      # a single char from: [a-zA-Z\u00E0-\u00EF]
   )+                        # end non-capture group, do 1 or more times
$                     # end of string

请在将答案标记为正确之前对其进行测试。其他人可能会访问此帖子 在将来。