首页 > 解决方案 > 从字符串数组或列表c#中查找第一个匹配字符串的索引

问题描述

我在表格中有字符串

var dummyString = $@"SIGNED APPLICATION AND AFFIDAVIT REQUIRED  LOCATION:  BLK 99, LOT 9 AND BLK 100 LOT 9, 10, 11, 12 & 13 RT 38 EAST HAINESPORT, NJ  BASED ON:  VACANT LAND";

我想做的是从这个字符串中提取位置/地址。我可以很容易地找到LOCATION 的索引:但想不出有效的解决方案来解决我应该终止字符串的索引。最简单的选择是遍历列表并找到状态代码的索引,但这不是一种非常有效的处理方式。

我认为解决这个问题的方法是使用美国州代码列表,然后在LOCATION 的索引之后找到任何州代码的第一个匹配的索引:带有空格的子字符串,这样我就可以找到完整的州代码及其索引。

public const List<string> USStateCodes = new List<string> { "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VI", "VA", "WA", "WV", "WI", "WY" };

关于如何从这里开始的任何想法?

我想要的输出是:

BLK 99、LOT 9 和 BLK 100 LOT 9、10、11、12 和 13 RT 38 东海恩斯波特,新泽西州

这里陈述的问题是更大逻辑的一部分,我使用正则表达式查找邮政编码的索引(5 位数字)作为终止符,但在某些情况下,邮政编码可能不存在于地址中(用户错误)。我仍然必须能够提取地址。

标签: c#regex

解决方案


您可以使用

var dummyString = @"SIGNED APPLICATION AND AFFIDAVIT REQUIRED  LOCATION:  BLK 99, LOT 9 AND BLK 100 LOT 9, 10, 11, 12 & 13 RT 38 EAST HAINESPORT, NJ  BASED ON:  VACANT LAND";
var USStateCodes = new List<string> { "AL", "AK", "AS", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VI", "VA", "WA", "WV", "WI", "WY" };
var result = Regex.Match(dummyString, $@"LOCATION:\s*(.*?\b(?:{string.Join("|", USStateCodes)}))\b")?.Groups[1].Value;

请参阅C# 演示result输出:BLK 99, LOT 9 AND BLK 100 LOT 9, 10, 11, 12 & 13 RT 38 EAST HAINESPORT, NJ.

结果模式是

LOCATION:\s*(.*?\b(?:AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY))\b

请参阅正则表达式演示

细节

  • LOCATION:- 一个固定的起始字符串
  • \s*- 0+ 个空格
  • (.*?\b(?:{string.Join("|", USStateCodes)}))- 第 1 组(结果将在组中捕获):
    • .*?- 除换行符以外的任何 0 个或更多字符(RegexOptions.Singleline也用于匹配换行符),尽可能少
    • \b- 单词边界
    • (?:{string.Join("|", USStateCodes)})- 使用州代码(如 )创建一个替代组(?:AL|AK|AS|...|WY)并匹配任何一个替代项
  • \b- 单词边界。

推荐阅读