【问题标题】:Regular expression ignore capturing group order正则表达式忽略捕获组顺序
【发布时间】:2018-10-29 14:52:33
【问题描述】:

请在 chrome 中打开以下网址 => https://regex101.com/r/rWLAOU/1/

正则表达式:

\b(f|fall|w|winter|s|spring|su|summer)\b\s*(?<!\d)(\d{4}|\d{2})(?!\d)

测试字符串:

Fall 2018
fall 18
2016 Fall
F2016
Fall2016

我定义的正则表达式适用于所有测试字符串,除非交换捕获组顺序(2016 Fall 或 16f 或 18Su) 正则表达式中是否有一种方法可以忽略 RegExp 捕获组的顺序

【问题讨论】:

  • Please open following URL in chrome 不要告诉人们去外部网站,在你的问题中发布所有相关代码。
  • @CertainPerformance 即使他发布了正则表达式,我们也必须使用 regex101 或类似的东西。
  • @revo 关键是,如果将来链接断开,该问题将无法回答或对任何人都有帮助。如果正则表达式存在问题,则不会发生这种情况。
  • @Sweeper 是的,我知道你在说什么,但你没有明白我的意思。然而,在那个 future 中——我认为你所说的未来不会在接下来的几秒钟内发生——这可能会得到答案或被关闭。所以不必担心无法回答。这对任何人也没有帮助。我更新了问题以包含正则表达式。
  • 你应该解释你真正的问题是什么。我们看到了正则表达式是如何工作的,你到底需要什么?为什么你认为你需要相同的组排序?每个提供的示例字符串的最终结果应该是什么样的?请注意,您当前的正则表达式(在这篇文章中)不需要后视,它与 \b(f|fall|w|winter|s|spring|su|summer)\s*(\d{4}|\d{2})(?!\d) 相同。另外,为什么不使用 4 个组并检查哪一组匹配以在结果数组中获得正确的值?见regex101.com/r/rWLAOU/3

标签: javascript regex swap capturing-group


【解决方案1】:

您可以使用两个部分的交替,其中年份和季节互换,然后仅抓取匹配的捕获:

\b(?:(f(?:all)?|w(?:inter)?|s(?:pring|u(?:mmer)?)?)\s*(\d{2}(?:\d{2})?)|(\d{2}(?:\d{2})?)\s*(f(?:all)?|w(?:inter)?|s(?:pring|u(?:mmer)?)?))\b

regex demo

我与您的替代方案签约以提高匹配效率:所有替代方案都应仅在唯一位置匹配。单词边界似乎足以满足您的情况。

在 JS 中,你可以动态构建模式:

var strs = ['Fall 2018','fall 18','2016 Fall','F2016','Fall2016'];
var season = "(f(?:all)?|w(?:inter)?|s(?:pring|u(?:mmer)?)?)";
var year = "(\\d{2}(?:\\d{2})?)";
var p = new RegExp("\\b(?:" + season + "\\s*" + year + "|" + year + "\\s*"+ season + ")\\b","i");
var results=[], m;
for (var s of strs) {
  m  = s.match(p);
  if (m) {
    if (m[1]) {
      console.log(m[1],":", m[2]); 
    } else {
      console.log(m[3],":", m[4]); 
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多