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

Posted

技术标签:

【中文标题】使用正则表达式匹配字符串的相同开始和结束字符【英文标题】:Match the same start and end character of a string with Regex 【发布时间】:2018-03-05 09:26:24 【问题描述】:

我正在尝试将字符串的开始和结束字符匹配为相同的元音。我的正则表达式在大多数情况下都有效,但在其他情况下失败:

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

示例输入:

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

【问题讨论】:

在什么情况下会失败? Regular Expression to match first and last character的可能重复 \1 是什么意思? \1 匹配第一个捕获组最近匹配的相同文本 【参考方案1】:

上面已经提到了正确的答案,只是为了更清楚一点:

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

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

【讨论】:

【参考方案2】:

只是我为了好玩而写的@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】:
/^([aeiou])[a-z]\1$/

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

【讨论】:

你的正则表达式[a-z]必须匹配并且只匹配一次字母,例如,“aa”和“axxa”将不匹配。但是你给个很好的建议,我用/^([aeiou])[a-z]*\1$/来代替。 要只捕获一个,您可以像这样添加1 /^([aeiou]1)[a-z]+\1$/【参考方案4】:

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

当你有时,例如:

aeqwae

您说输出为真,但它无效,因为ae 不同。好吧,正则表达式只是匹配前一个字符(e 之前),即a。因此,匹配是有效的。所以,你明白了:

[aeqwa]e

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

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

/^([aeiou]).*\1$/

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

测试正则表达式的好工具是Regex101。试试看!

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

【讨论】:

对我来说,上面的答案中唯一缺少的是,你如何重新使用开头匹配的值作为结尾? ... \1 是什么意思? "捕获组。(正则表达式)括号对它们之间的正则表达式进行分组。它们将与其中的正则表达式匹配的文本捕获到一个编号组中,该组可以通过编号的反向引用重复使用。"所以我想我只是回答了我自己的问题。感谢您提供的非常酷的答案。现在,向前和向前理解(g)(m)等。人。 要了解 \1 的实际作用,您可能想看看这个:javascript.info/regexp-backreferences#backreference-by-number-n 您可能必须添加另一个 \ 来转义,以避免潜在的“在严格模式下不允许使用八进制文字”错误。

以上是关于使用正则表达式匹配字符串的相同开始和结束字符的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配指定字符开始和指定字符结束?

正则表达式总结

正则匹配表

java的正则表达

01正则表达式相关

python 正则表达式