繁体   English   中英

全局正则表达式在 for 循环内返回不正确的索引

[英]global Regexp is returning incorrect index inside for loop

我正在尝试从字符串中删除时间戳(格式为数字破折号)。 在这个过程中,我尝试了全局 RegExp。 我想出了以下代码:

for(let filename of ["123-123_aaa_bbb_ccc","aaa_bbb_ccc_129-999"])
{
  let s=filename.split("_")
  let globalRegex = new RegExp('^\d+\-\d+$', 'g');
  for(let si of s){
    if(globalRegex.test(si)) break
  }
  console.log(`match found at: `,globalRegex.lastIndex)
}

返回:

match found at:  0
match found at:  0

我的问题是:

  1. 如何正确地从字符串中删除时间戳?
  2. 为什么两次运行的正则表达式都返回 0?
  • 我预计(返回 0 然后 3 索引) 似乎全局正则表达式的状态没有为第二次运行重新初始化。 但是我认为它会是,因为它是在 for 循环中重新声明的

这里有很多问题:

  • 您得到0是因为您的正则表达式不匹配,并且它不匹配是因为您在常规字符串文字中定义了正则表达式字符串,因此丢失了所有单个反斜杠。 模式必须使用正则表达式文字设置, let globalRegex = /^\d+\-\d+$/; (请参阅为什么这个 javascript 正则表达式不起作用? )。 请注意没有g标志,如果将其与RegExp#test()一起使用,则不得使用g标志以避免出现问题(请参阅为什么带有全局标志的 RegExp 会给出错误的结果? )。
  • 即使您正确定义了正则表达式,您也会得到0作为输出,因为/^\d+\-\d+$/正则表达式可以并且只会在字符串的开头匹配(索引=0)。 您似乎想要获取字符串中“单词”或“令牌”的 ID,因此您需要对它们进行计数。

因此,您可以将代码重写为

 for(let filename of ["123-123_aaa_bbb_ccc","aaa_bbb_ccc_129-999"]) { let result = -1; let s=filename.split("_") let globalRegex = /^\d+\-\d+$/; for (const [index, si] of s.entries()) { if(globalRegex.test(si)) { result = index break } } console.log(`match found at: `, result) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM