【问题标题】:Javascript - regex only catches the first 3 matchesJavascript - 正则表达式仅捕获前 3 个匹配项
【发布时间】:2015-07-14 16:28:59
【问题描述】:

首先,提前感谢您提供的任何帮助。

我的正则表达式仅捕获我尝试提取的字符串的前 3 个实例。有什么想法吗?

我的代码:

var objArgs         = WScript.Arguments;
var objFileSys      = new ActiveXObject("Scripting.FileSystemObject");
var objFolder       = objFileSys.getFolder(objArgs.Item(0));
var objTSetNum      = new RegExp("^ST.((\\d+)+)", "gm");
var objFile         = null;
var srcFile         = null;

for (var objFileEnum = new Enumerator(objFolder.files); !objFileEnum.atEnd(); objFileEnum.moveNext()) {
objFile = objFileSys.OpenTextFile(objFileEnum.item(), 1, false, 0);
srcFile = objFile.ReadAll();
objFile.Close();

// Check for different values in the TSet entries
// Build array to hold all TSet values found
var arrTSet;
while ((arrTSet = objTSetNum.exec(srcFile)) !== null) {
    // arrTSet = objTSetNum.exec(srcFile);
    WScript.Echo("arrTSet is: " + arrTSet);
    WScript.Echo("Length of arrTSet is: " + arrTSet.length)
    //var allTSetSame = true;
}

一个示例文本文件包含 5 个以“ST*”开头的行实例 - 不应该将所有 5 个实例都放入数组中吗?:

ISA*00*          *00*          *01*041199639      *08*9272590000     *150704*1131*U*00401*000001324*0*P*:
ST*865*0001
ST*865*0001
ST*865*0001
ST*865*0001
ST*865*0001
IEA*5*000001324

有什么建议吗?我的直觉告诉我 exec() 函数正在改变一些东西,但我找不到任何关于它可能会改变什么的细节。

感谢您的帮助!

编辑:当然,一旦我发布它,我就找到了答案。 exec() 是有状态的,所以我需要将返回的每个结果推送到数组中,类似于:

var arrTSet = [];
var match;  

  while (match = objTSetNum.exec(srcFile)) {
    arrTSet.push(+match[1]);            
}

在这里找到的(给予信用): Why does Javascript's regex.exec() not always return the same value?

【问题讨论】:

  • ^ST.(\\d+) 给出相同的结果时,你为什么使用^ST.((\\d+)+)
  • 您能否使用警报或其他方法来确保在评估正则表达式之前传递给它的字符串与您期望的完全一样?什么都没有读错?
  • 故障排除的残余。如您所知,那时我正在向墙上扔屎,看看是否有任何东西粘住。很抱歉在发布之前没有清理它。
  • awwww 废话,你好像在我发布它时就想出来了。
  • 别担心 - 我知道了。 :) 非常感谢您的帮助!

标签: javascript regex


【解决方案1】:

我认为问题可能是 RegExp.exec 没有返回所有可能结果的数组,它返回第一个结果以及该结果中的所有匹配项。如果您查看返回的数组,您的匹配项将是:

  1. ST*865
  2. 865
  3. 865

Exec 每次调用都会继续返回下一个匹配项

【讨论】:

    【解决方案2】:

    这里已经回答了:

    Why does Javascript's regex.exec() not always return the same value?

    对于已经回答的问题,我们深表歉意。

    【讨论】:

    • 我不认为这完全是一回事。答案可能是一样的,但把你带到这里的问题肯定是不同的。
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 2014-06-26
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多