首页 > 解决方案 > 如何在第一场比赛中停止正则表达式(非贪婪搜索)

问题描述

我想在 json 字符串中找到所有出现的 freeWifi = "Y" 和 state = "NY" 但如果连续出现 2 次,它会将它们视为一个匹配项而不是 2 个:

我使用的模式是'"freeWifi": "Y",(\s+\S+)+state": "NY"'。

当我使用 '"freeWifi": "Y",(\s+\S+){5}state": "NY"' 时,它为我提供了所需的解决方案,但如果将新行添加到 json 中,它还不够通用文件。

部分数据:

     "freeWifi": "Y", 
    "storeNumber": "14372", 
    "phone": "(305)672-7055", 
    "state": "NY", 
    "storeUrl": "http://www.mcflorida.com/14372", 
    "playplace": "N", 
    "address": "1601 ALTON RD", 
    "storeType": "FREESTANDING", 
    "archCard": "Y", 
    "driveThru": "Y"
  }
  "type": "Feature", 
  "properties": {
    "city": "MIAMI", 
    "zip": "33135", 
    "freeWifi": "Y", 
    "storeNumber": "7408", 
    "phone": "(305)285-0974", 
    "state": "NY", 
    "storeUrl": "http://www.mcflorida.com/7408", 
    "playplace": "Y", 
    "address": "1400 SW 8TH ST", 
    "storeType": "FREESTANDING", 
    "archCard": "Y", 
    "driveThru": "Y"
  }
}, 
{
  

第二部分

实施 Steven 解决方案后,当我在包含许多条目的数据文件上尝试它时,程序永远运行并且没有给出答案。

新的正则表达式是:'"freeWifi": "Y",(\s+?\S+?)+?state": "NY"'。

为了了解系统挂起的原因,我检查了程序的部分数据,每次将大小增加 100,000 字节。结果显示随着大小的增加显着放缓,这表明正则表达式可能存在问题,如 Program run forever when matching regex中所述。

对不起,桌子的显示很糟糕,但我无法让它变得更好(我删除了标签并用空格填充,但它忽略了它们)

Time_Passed.....Size_Checked File_Size Matches
7.3e-05 ...........100000 8345167 30
0.008906 200000 8345167 30
0.466485 300000 8345167 31
0.500054 400000 8345167 75
0.523969 500000 8345167 142
0.553361 600000 8345167 201
0.586032 700000 8345167 201
1.072181 800000 8345167 338
1.114541 900000 8345167 482
1.157304 1000000 8345167 630
1.203889 1100000 8345167
1606 1.608035666
3.126974 1300000 8345167 630
6.501044 1400000 8345167 630
12.476704 1500000 8345167 630

标签: regex

解决方案


惰性运算?符是. 您使用惰性运算符的表达式将是"freeWifi": "Y",(\s+?\S+?)+state": "NY"See example in regexr

正如@anubhava 指出的那样,这不适用于通用输入。例如我想你不想要这个匹配:

  "type": "Feature", 
  "properties": {
    "freeWifi": "Y", 
    "storeNumber": "9876", 
    "state": "PA"
  }
},
  "type": "Feature", 
  "properties": {
    "freeWifi": "N", 
    "storeNumber": "1234", 
    "state": "NY", 
     }
},

推荐阅读