我正在尝试将字符串与以下内容匹配:
[A-Z]
[a-zA-Z- '\u00E0-\u00EF]
(Latin-1 Supplement - Match Unicode Block Range)[- ']
结尾或[- ']
彼此相邻。2
个字符我一直在尝试以下方法:
new RegExp(/^[A-Z](?!.*[- ']$).*[a-zA-Z- '\u00E0-\u00EF]$/);
我的问题不在于我无法理解正则表达式的作用,而是它们是否正确。 编写一个看起来应该可以正常运行的正则表达式是非常容易的(或者不是这样)。
非常感谢任何帮助。
修改
有效字符串:Marie-Noëlle Tranchant
,Jean-François Copé
...
答案 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
请在将答案标记为正确之前对其进行测试。其他人可能会访问此帖子 在将来。