【问题标题】: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(无效)

【问题讨论】:

标签: javascript regex validation


【解决方案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
      • 您可能必须添加另一个 \ 来转义,以避免潜在的“在严格模式下不允许使用八进制文字”错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2020-08-23
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多