Javascript 将字符串的相同起始字符和结束字符与正则表达式匹配

Javascript 将字符串的相同起始字符和结束字符与正则表达式匹配,javascript,regex,validation,Javascript,Regex,Validation,我试图将字符串的起始字符和结束字符匹配为同一个元音。我的正则表达式在大多数情况下都能工作,但在其他情况下会失败: var re = /([aeiou]).*\1/; re.test(str); 样本输入: abcde,输出-假(有效) abcda,输出-真(有效) aabcdaa,输出-真(有效) aeqwae,输出-真(无效) ouqweru,输出-真(无效) 您需要在字符串中添加锚点 如果您有,例如: aeqwae 您说输出为true,但它无效,因为a与e不同。好的,正则表达式只是匹配

我试图将字符串的起始字符和结束字符匹配为同一个元音。我的正则表达式在大多数情况下都能工作,但在其他情况下会失败:

var re = /([aeiou]).*\1/;
re.test(str);
样本输入:

  • abcde
    ,输出-假(有效)
  • abcda,输出-真(有效)
  • aabcdaa
    ,输出-真(有效)
  • aeqwae
    ,输出-真(无效)
  • ouqweru
    ,输出-真(无效)

您需要在字符串中添加锚点

如果您有,例如:

aeqwae
您说输出为true,但它无效,因为
a
e
不同。好的,正则表达式只是匹配上一个字符(在
e
之前),即
a
。因此,匹配是有效的。所以,你得到了这个:

[aeqwa]e
括号中包含的字符串是实际匹配项,以及它返回
true
的原因

如果将正则表达式更改为:

/^([aeiou]).*\1$/
通过添加
^
,您告诉它匹配的开始必须是字符串的开始,通过添加
$
您告诉它匹配的结束必须是字符串的结束。这样,如果存在匹配,则整个字符串必须匹配,这意味着
aeqwae
将不再匹配

测试正则表达式的一个很好的工具是。试试看

注意:根据您的输入,您可能需要设置全局(g)或多行(m)标志。全局标志防止正则表达式在第一次匹配后返回。多行标志使
^
$
匹配行的开始和结束(而不是字符串)。我在测试您的输入时使用了这两种方法

/^([aeiou])[a-z]\1$/

只是一点改进,捕捉字母。

只是我为了好玩而写的@Hristiyan Dodov答案的另一个版本

regex=/^(a | e | i | o | u)。*\1$/
常量字符串=['abcde'、'abcda'、'aabcdaa'、'aeqwae'、'ouqweru']
strings.forEach((e)=>{
常数结果=正则表达式测试(e)
console.log(e,result)

})
上面已经提到了正确答案,只是为了进一步澄清:

regEx= /^([a,e,i,o,u])(.*)\1$/

这里,
\1
是再次匹配相同文本的反向引用,您可以多次重复使用相同的反向引用。大多数正则表达式支持多达99个捕获组和两位数的反向引用。因此,如果您的正则表达式有99个捕获组,\99是一个有效的反向引用。

在什么情况下失败?可能与\1的意思重复?\1匹配与第一个捕获组最近匹配的文本相同我在上述答案中唯一缺少的是,然后,如何将开始时匹配的值重新用于结束。。。\1的作用是什么?“捕获组。(regex)括号将它们之间的regex分组。它们将与其中的regex匹配的文本捕获到一个编号组中,该组可以与编号的反向引用一起重用。”因此我想我刚刚回答了我自己的问题。谢谢你给我一个非常酷的回答。现在,继续前进以了解(g)(m)等。要了解\1的实际作用,您可能需要看到以下内容:您可能必须添加另一个\以转义,以避免潜在的“严格模式下不允许八进制文字”错误。正则表达式
[a-z]
必须匹配并且仅匹配一次字母,例如,“aa”和“axxa”将不匹配。但是您给出了一个很好的建议,我使用
/^([aeiou])[a-z]*\1$/
来代替。