Найти индекс первой подходящей строки из строкового массива или списка c# - PullRequest
2 голосов
/ 10 апреля 2020

У меня есть строка в форме

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 EAST HAINESPORT, Нью-Джерси

Указанная здесь проблема является частью более крупной логики c, где я использую регулярное выражение, чтобы найти индекс почтового индекса (5 цифр) как терминатор, но в некоторых случаях почтовый индекс может не присутствовать в адресе (ошибка пользователя). Я все еще должен быть в состоянии извлечь адрес.

1 Ответ

3 голосов
/ 10 апреля 2020

Вы можете использовать

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

См. Демонстрационный пример regex .

Подробности

  • LOCATION: - фиксированная начальная строка
  • \s* - 0+ пробелов
  • (.*?\b(?:{string.Join("|", USStateCodes)})) - Группа 1 (результат будет зафиксирован в группе):
    • .*? - любые 0 или более символов, кроме символы новой строки (также используйте RegexOptions.Singleline для соответствия строк новой строки), как можно меньше
    • \b - граница слова
    • (?:{string.Join("|", USStateCodes)}) - создает группу чередования с кодами состояния ( как (?:AL|AK|AS|...|WY)) и соответствует любой из альтернатив
  • \b - граница слова.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...