正则表达式从字符串中获取街道名称不与非捕获组一起使用

时间:2018-02-02 20:43:16

标签: c# regex

已经搜遍了所有但似乎无法弄清楚这一点。有一些地址,我试图打破街道名称。

我需要能够获得Sea Spray或Walden Elms或High star以及单词街道和街道,类似于第54或第12街。

996 SEA SPRAY DR
174 S WALDEN ELMS CIR
1210 CHAPEL CONE LN#1210
602 SAWYER ST#710
911国家 16715 CLAY RD
12302 HIGH STAR DR
575 PETE SCHAFF BLVD
2700 TOWN CENTER BLVD N
601 54TH ST#1105
815 12TH ST

以下是我需要的街道,但是除了54和12之外的所有街道都包括街道后缀。为什么不是最后一个非捕获组工作?

(\d+(?:ST|RD|TH|ND|BLVD|LN|DR|CIR))\s|(\s[A-Z]\w*)|(\d+(?:ST|RD|BLVD|CIR|LN))

2 个答案:

答案 0 :(得分:1)

问题是中间组中的or表达式包含您要排除的项目。

您的正则表达式实际上是包含|条件的三个表达式((\d+(?:ST|RD|TH|ND|BLVD|LN|DR|CIR))\s

  1. (\s[A-Z]\w*)
  2. (\d+(?:ST|RD|BLVD|CIR|LN))
  3. \s
  4. 第一组似乎试图匹配基于数字的街道名称(例如:" 14th"," 3rd")并成功捕获第54街的示例地址第12街。

    第三组似乎只是第一组的一个子集,但没有尾随空格(\s)表达式。它与您的示例中的任何内容都不匹配。

    第二组捕获任何空格([A-Z]),后跟大写A-Z(\w*)中的任何单个字符,然后捕获任意数量的单词字符((?!(RD|DR|BLVD|CIR|LN)))。这几乎与其他所有东西相匹配。如果你想从匹配的内容中排除" ST,RD,BLVD"等,那么你需要为这些词((\s(?!(RD|DR|BLVD|CIR|LN))[A-Z]\w*) )做negative lookahead assertion你的表达式,这将使中间表达式如下所示:

    (\d+(?:ST|RD|TH|ND|BLVD|LN|DR|CIR))\s|(\s(?!(RD|DR|BLVD|CIR|LN))[A-Z]\w*)|(\d+(?:ST|RD|BLVD|CIR|LN))
    

    ,完整的表达式如下:

    15W22S 87th St

    所有这一切,我想:

    • 您的正则表达式存在其他问题
    • 正如许多其他人所建议的那样,解析地址要困难得多,因此您最好使用邮政服务API或某些第三方库。例如,就在我的路上就是地址var vertices = d3.range(100).map(function(d) { return [Math.random() * width, Math.random() * height]; }); 。这将使你的正则表达式失败,因为房子"数字"包括信件。

答案 1 :(得分:0)

如果您的地址列表有限,并且您能够如上所述预测格式,那么您不能在C#中使用简单的字符串拆分吗?

string[] arrSplitAdd = address.Split(new string[] {"ST","RD","TH","ND","BLVD","LN","DR","CIR"},StringSplitOptions.RemoveEmptyEntries);
string numberAndStreet=arrSplitAdd[0];
string streetName = RegEx.Replace(streetName,"[0-9]*","");

为每个地址线迭代此逻辑。