批处理 - 计算两个模式之间的字符串外观

时间:2017-07-04 04:12:46

标签: regex batch-file

此问题与this question.

非常相似

我一直在试图计算括号之间出现多少字符串。考虑以下文本文件(虽然它看起来像.bat脚本)

(
echo a
echo b
echo c
)
echo z

在上面的文件中,我们可以看到4 echo,但我只想计算括号内的那些(结果应为3)

for /f "delims=][  tokens=2" %%H in ('FART.exe -c -i -p %File% ^( a') do set /a count+=1

此代码有效,但只有1,因为我无法弄清楚如何计算多个外观。请帮助我,任何帮助将不胜感激。

修改 - 5/7/17

你可以假设

  • 每行只有1 echo
  • 圆括号不是嵌套的
  • echo与括号不会出现在同一行
    • 奖励,如果您可以使您的脚本在同一行括号中计算echo

3 个答案:

答案 0 :(得分:1)

你可以试试这个正则表达式:

echo(?=((?!\().)*\))

单词' echo'的匹配数量内括号将是你的计数

Regex101 Demo

因为,Windows批处理不支持前瞻,因此您可以使用python脚本用于相同的目的,而不是使用批处理,如果您必须应用正则表达式。另外,您可以批量尝试非正则表达式解决方案

此块将执行:(run here

regex = r"echo(?=((?!\().)*\))"
matches = re.finditer(regex, test_str, re.DOTALL)
count=0

for match in matches:
        count +=1
print(count)

其中test_str是文件的内容

答案 1 :(得分:1)

对于那些期望批处理文件的人,比SteveFest更尊重规则,这是一个基本的例子,(可能不是最有效的,但嘿,这种任务不会被设计对于大文件无论如何)

private  void updateGetData(EventType e)
{
    try 
    {
        Realm realm = Realm.GetInstance();
        realm.WriteAsync(tempRealm =>
        {
            if (Settings.IsSingleOpportunityUpdated == false)
            {
                tempRealm.Add(e.response, true);
            }
            else if (Settings.IsSingleOpportunityUpdated)
            {
                if (e.response != null &&  e.response.opportunitiesList.Count > 0)
                {
                    long opportunityId = e.response.opportunitiesList[0].opportunityId;
                    var opportunity = tempRealm.All<Opportunity>().FirstOrDefault(d => d.opportunityId == opportunityId);
                    e.response.opportunitiesList[0].isOpportunitySync = 0;
                    e.response.opportunitiesList[0].isSync = SyncStatus.SYNCED;
                    e.response.opportunitiesList[0].mOpportunityId = opportunity.mOpportunityId;
                    Debug.WriteLine("Opportunity Id after getOpportunity " + opportunity.opportunityId + " " + opportunityId + " " + e.response.opportunitiesList[0].isSync);

                    tempRealm.Add(e.response.opportunitiesList[0], true);
                }
                else
                {
                    Debug.WriteLine("RealmDB opportunity response is empty " + Settings.IsSingleOpportunityUpdated);
                }
            }
        });
    }
    catch(Exception exception)
    {
        Debug.WriteLine("RealmDB " + exception.StackTrace);
    }
}

答案 2 :(得分:1)

您的规格不完整,因为如上所述,此问题可以简化为:计算左侧和右侧之间的行数

@echo off
setlocal

set "open="
for /F "delims=:" %%a in ('findstr /N "( )" test.txt') do (
   if not defined open (
      set "open=%%a"
   ) else (
      set /A count=%%a-open-1
   )
)
echo %count%