我正在尝试将字符串的开头和结尾字符匹配为相同的元音。我的正则表达式在大多数场景中都有效,但在其他场景中失败了:
var re = /([aeiou]).*\1/;
re.test(str);
示例输入:
abcde
,输出 - false(有效)abcda
,输出 - true(有效)aabcdaa
,输出 - true(有效)aeqwae
,输出 - true(无效)ouqweru
,输出 - true(无效)答案 0 :(得分:30)
您需要在字符串中添加锚点。
当你有,例如:
https://aaa.com/aaa/?k=0000
您说输出为true,但它无效,因为aeqwae
与a
不同。好吧,正则表达式只是匹配前一个字符(e
之前),即e
。因此,匹配有效。所以,你明白了:
a
括号中的字符串是实际匹配以及返回[aeqwa]e
的原因。
如果您将正则表达式更改为:
true
通过添加/^([aeiou]).*\1$/
,您可以告诉它匹配的开头必须是字符串的开头,并通过添加^
告诉它结束match 必须是字符串的结尾。这样,如果匹配,则必须匹配整个字符串,这意味着$
将不再匹配。
测试正则表达式的一个很好的工具是Regex101。试一试!
注意:根据您的输入,您可能需要设置全局(g)或多行(m)标志。全局标志阻止正则表达式在第一次匹配后返回。多行标记使aeqwae
和^
匹配行的开头和结尾(不是字符串)。在使用您的输入进行测试时,我使用了它们。
答案 1 :(得分:0)
/^([aeiou])[a-z]\1$/
在捕捉字母方面稍有改进。
答案 2 :(得分:0)
我写的只是一个不同版本的@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)
})
答案 3 :(得分:0)
上面已经提到了正确答案,只是为了进一步澄清:
regEx= /^([a,e,i,o,u])(.*)\1$/
在这里,\1
是用于再次匹配相同文本的反向引用,您可以多次重复使用相同的反向引用。大多数正则表达式版本最多支持99个捕获组和两位数的反向引用。因此,如果您的正则表达式具有99个捕获组,则\ 99是有效的反向引用。visit_for_detail