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

Nes*_*esh 19 javascript regex validation

我正在尝试将字符串的开头和结尾字符匹配为相同的元音.我的正则表达式在大多数场景中都有效,但在其他场景中失败了:

var re = /([aeiou]).*\1/;
re.test(str);
Run Code Online (Sandbox Code Playgroud)

样本输入:

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

Hri*_*dov 44

您需要为字符串添加锚点.

当你有,例如:

aeqwae
Run Code Online (Sandbox Code Playgroud)

你说输出是真的,但它无效,因为a它不一样e.好吧,正则表达式只是匹配前一个字符(之前e),即a.因此,匹配有效.所以,你得到这个:

[aeqwa]e
Run Code Online (Sandbox Code Playgroud)

括号中的字符串是实际匹配以及返回的原因true.

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

/^([aeiou]).*\1$/
Run Code Online (Sandbox Code Playgroud)

通过添加^,您可以告诉它匹配的开始必须是字符串的开头,并通过添加$告诉它匹配的结尾必须是字符串的结尾.这样,如果匹配,则必须匹配整个字符串,这意味着aeqwae将不再匹配.

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

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


Pab*_*blo 5

我为好玩而写的@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)
})
Run Code Online (Sandbox Code Playgroud)


小智 5

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

regEx= /^([a,e,i,o,u])(.*)\1$/
Run Code Online (Sandbox Code Playgroud)

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