Javascript正则表达式的困难
我正在尝试将字符串与以下内容匹配:Javascript正则表达式的困难,javascript,regex,Javascript,Regex,我正在尝试将字符串与以下内容匹配: 以[A-Z] 包含[a-zA-Z-'\u00E0-\u00EF]() 禁止任何其他字符 不以[-']结尾,或使[-']相邻 至少有2个字符 我一直在尝试以下方法: new RegExp(/^[A-Z](?!.*[- ']$).*[a-zA-Z- '\u00E0-\u00EF]$/); 我的问题不是我不能理解正则表达式做什么,而是它们是否正确。 编写一个看起来应该可以工作的正则表达式非常容易(或者不容易),但却忽略了一些事情 任何帮助都将不胜感激 编辑 有
- 以
[A-Z]
- 包含
()[a-zA-Z-'\u00E0-\u00EF]
- 禁止任何其他字符
- 不以
结尾,或使[-']
相邻[-']
- 至少有
字符2个
new RegExp(/^[A-Z](?!.*[- ']$).*[a-zA-Z- '\u00E0-\u00EF]$/);
我的问题不是我不能理解正则表达式做什么,而是它们是否正确。
编写一个看起来应该可以工作的正则表达式非常容易(或者不容易),但却忽略了一些事情
任何帮助都将不胜感激
编辑
有效字符串:
Marie Noëlle Tranchant
,Jean-François Copé
。测试正则表达式的一个非常基本的方法是使用文本字符串,例如“blah this is text”,并使用.match方法。您可以打开一个js控制台(Chrome中的Ctrl+Shift+J)并直接运行它以查看返回的内容
"Marie-Noëlle Tranchant".match(/^[A-Z][-a-zA-Z '\u00E0-\u00EF]*[^- ']$/);
测试正则表达式的一种非常基本的方法是获取一个文本字符串,例如“blah this is text”,并对其使用.match方法。您可以打开一个js控制台(Chrome中的Ctrl+Shift+J)并直接运行它以查看返回的内容
"Marie-Noëlle Tranchant".match(/^[A-Z][-a-zA-Z '\u00E0-\u00EF]*[^- ']$/);
下面是一个证明,为什么这符合您的标准。如果将非捕获组(?:…)
更改为(…)
,则它也是满足条件的最短regexp
以[A-Z]开头
因为^[A-Z]
包含[a-zA-Z-'\u00E0-\u00EF](拉丁语-1增补-匹配Unicode块范围)
禁止任何其他字符
因为整个内容必须匹配仅包含这些字符的字符集
不以[-']结尾,也不相邻[-']
因为[-']
被限制为零或每次[a-zA-Z\u00E0-\u00EF]
至少有2个字符
因为[A-Z]
至少匹配一个字符,(?:…)
组后面的+
需要另一个字符
下面是一个证明,为什么这符合您的标准。如果将非捕获组(?:…)
更改为(…)
,则它也是满足条件的最短regexp
以[A-Z]开头
因为^[A-Z]
包含[a-zA-Z-'\u00E0-\u00EF](拉丁语-1增补-匹配Unicode块范围)
禁止任何其他字符
因为整个内容必须匹配仅包含这些字符的字符集
不以[-']结尾,也不相邻[-']
因为[-']
被限制为零或每次[a-zA-Z\u00E0-\u00EF]
至少有2个字符
因为
[A-Z]
至少匹配一个字符,而(?:…)
组后面的+
需要另一个字符。我认为您的regexp不会满足您的要求。它应该接受以[A-Z]
开头,以[A-zA-Z\u00E0-\u00EF]
结尾的任何字符串(中间有任何字符,包括您不想接受的字符),尽管我不能确定,因为我不知道如何处理未转义的“-”
我想你想要更像这样的东西:
new RegExp(/^[A-Z](?:(?!--|''| )[a-zA-Z\- '\u00E0-\u00EF])*[a-zA-Z\u00E0-\u00EF]$/);
我认为你的regexp不会做你想做的事。它应该接受以
[A-Z]
开头,以[A-zA-Z\u00E0-\u00EF]
结尾的任何字符串(中间有任何字符,包括您不想接受的字符),尽管我不能确定,因为我不知道如何处理未转义的“-”
我想你想要更像这样的东西:
new RegExp(/^[A-Z](?:(?!--|''| )[a-zA-Z\- '\u00E0-\u00EF])*[a-zA-Z\u00E0-\u00EF]$/);
编辑-重做
在重新访问此帖子后,我注意到以下评论:
“没有[-']相邻”这里的所有9种可能性,或者只有
同一个角色翻了个身jswolf19 2天前
@jswolf19没有:
'space'
,--
或'
堆栈101 2天前" 鉴于此,您必须使用@jswolf19所做的 他的正则表达式可以简化一些: pcre:
/^[A-Z](?:([\-'])(?!$\1)\[A-zA-Z\x{E0}-\x{EF}])+$/
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
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
请先测试答案,然后再将其标记为正确答案。其他人可以访问此线程将来。编辑-重做 在重新访问此帖子后,我注意到以下评论:
“没有[-']相邻”这里的所有9种可能性,或者只有
同一个角色翻了一倍?-jswolf19 2天前
@jswolf19没有:
“space”“space”
,--
或'
–2天前的堆栈101" 鉴于此,您必须使用@jswolf19所做的 他的正则表达式可以简化一些: pcre:
/^[A-Z](?:([\-'])(?!$\1)\[A-zA-Z\x{E0}-\x{EF}])+$/
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
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
请先测试答案,然后再将其标记为正确答案。其他人可以访问此线程将来 你能举一个有效字符串的例子吗?编辑过的问题-添加了有效字符串。“没有[-']相邻”所有9种可能性都在这里,或者只有同一个字符的三种可能折叠起来?@jswolf19没有:
“space”“space”
,--
或'
。您能给出一个有效字符串的示例吗?编辑的问题-添加的有效字符串。“没有[-']相邻”这里的所有9种可能性,或者只有同一字符的三种可能性重叠?@jswolf19没有:“空格”“空格”
,--
或'
。我的问题是遗漏了几件事:Ma5rie-N