我想匹配字符串的开头和结尾字符是相同的元音字母。我的正则表达式在大多数情况下都有效,但在某些情况下会失败:
var re = /([aeiou]).*\1/;
re.test(str);
示例输入:
abcde
,输出 - false(有效)abcda
,输出 - true(有效)aabcdaa
,输出 - true(有效)aeqwae
,输出 - true(无效)ouqweru
,输出 - true(无效)
我想匹配字符串的开头和结尾字符是相同的元音字母。我的正则表达式在大多数情况下都有效,但在某些情况下会失败:
var re = /([aeiou]).*\1/;
re.test(str);
示例输入:
abcde
,输出 - false(有效)abcda
,输出 - true(有效)aabcdaa
,输出 - true(有效)aeqwae
,输出 - true(无效)ouqweru
,输出 - true(无效)你需要在字符串中添加锚点。
例如,当你有:
aeqwae
您说输出结果是true,但是它不是有效的,因为a
与e
不同。嗯,正则表达式只匹配前一个字符(在e
之前),即a
。因此,匹配是有效的。所以,您会得到这个:
[aeqwa]e
在括号中的字符串是实际匹配并导致返回值为 true
的原因。如果你将正则表达式更改为以下内容:
/^([aeiou]).*\1$/
通过添加^
,您告诉它匹配的开头必须是字符串的开头,通过添加$
,您告诉它匹配的结尾必须是字符串的结尾。这样,如果有匹配项,则必须匹配整个字符串,这意味着aeqwae
将不再被匹配。^
和$
匹配每一行的开头和结尾(而不是整个字符串的开头和结尾)。当我使用您的输入进行测试时,我都使用了它们。这是我为了有趣而编写的@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$/
稍作改进,以捕捉字母。
[a-z]
必须匹配并且只能匹配一次字母,例如 "aa" 和 "axxa" 将不会被匹配。但是你给了一个好建议,我使用 /^([aeiou])[a-z]*\1$/
来替代。 - Jun Yu{1}
: /^([aeiou]{1})[a-z]+\1$/ - Jacksonkr