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

时间:2017-09-24 07:40:21

标签: javascript regex validation

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

var re = /([aeiou]).*\1/;
re.test(str);

示例输入:

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

4 个答案:

答案 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