[英]Match the same start and end character of a string with Regex
我试图将字符串的开始和结束字符匹配为相同的元音。 我的正则表达式适用于大多数情况,但在其他情况下失败:
var re = /([aeiou]).*\1/;
re.test(str);
样本输入:
abcde
,输出 - 假(有效)abcda
,输出 - 真(有效)aabcdaa
,输出 - 真(有效)aeqwae
,输出 - 真(无效)ouqweru
,输出 - 真(无效)您需要在字符串中添加锚点。
当你有,例如:
aeqwae
您说输出为真,但它无效,因为a
与e
。 好吧,正则表达式只是匹配前一个字符(在e
之前),即a
。 因此,匹配是有效的。 所以,你得到这个:
[aeqwa]e
括号中的字符串是实际匹配项以及它返回true
。
如果您将正则表达式更改为:
/^([aeiou]).*\1$/
通过添加^
,你告诉它匹配的开始必须是字符串的开始,通过添加$
你告诉它匹配的结束必须是字符串的结束。 这样,如果有匹配项,则必须匹配整个字符串,这意味着aeqwae
将不再匹配。
测试正则表达式的一个很好的工具是Regex101 。 试试看!
注意:根据您的输入,您可能需要设置全局 (g) 或多行 (m) 标志。 全局标志可防止正则表达式在第一次匹配后返回。 多行标志,使^
和$
行(而不是字符串)的开始和结束匹配。 在使用您的输入进行测试时,我同时使用了它们。
只是一个不同版本的@Hristiyan Dodov 回答,我是为了好玩而写的。
regex = /^(a|e|i|o|u).*\\1$/ const strings = ['abcde', 'abcda', 'aabcdaa', 'aeqwae', 'ouqweru'] strings.forEach((e)=>{ const result = regex.test(e) console.log(e, result) })
上面已经提到了正确答案,只是为了进一步澄清:
regEx= /^([a,e,i,o,u])(.*)\1$/
这里, \\1
是再次匹配相同文本的反向引用,您可以多次重复使用相同的反向引用。 大多数正则表达式支持多达 99 个捕获组和两位数的反向引用。 所以 \\99 是一个有效的反向引用,如果你的正则表达式有 99 个捕获组。 访问详细信息
/^([aeiou])[a-z]\1$/
只是一点点改进,以捕捉字母。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.