c# - 从字符串数组或列表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 位数字)作为终止符,但在某些情况下,邮政编码可能不存在于地址中(用户错误)。我仍然必须能够提取地址。
解决方案
您可以使用
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
- 单词边界。
推荐阅读
- javascript - Javascript 私有函数辅助
- python - 在 Pandas 的列中查找相似的短语
- python - 获取蜂巢表的 PySpark 作业正在破坏
- ios - 切换选项卡后 UI 会随 ObservableObject 发生变化
- python - 将熊猫数据框转换为不同的格式
- excel - 如何理解 Excel IF 语句中的这个表达式?
- java - 如果源代码加载文件,Gradle 将不会运行项目
- r - 如何正确使用 semi_join 函数
- typescript - 可分配给类型,但不能用不同的子类型实例化
- batch-file - 运行bat文件时如何**不**更改命令提示符中的标题栏