C # - Поиск строк - PullRequest
       49

C # - Поиск строк

2 голосов
/ 29 марта 2012

Не могу найти хорошего решения этой проблемы. У меня есть массив строк, которые поступают из отчета, который я получаю о потерянном или украденном оборудовании. Я использовал функцию string.IndexOf в остальной части формы, и она работает довольно хорошо. Эта проблема связана с полем, в котором указано, было ли устройство потеряно или украдено.

Пример:

"Потерян или украден? Потерян"

"Потерян или украден? Украден"

Мне нужно иметь возможность прочитать это, но когда я делаю string.IndexOf(@"Lost"), он всегда будет возвращаться потерянным, потому что он в вопросе.

К сожалению, я не могу каким-либо образом изменить саму форму, и из-за характера ее передачи я не могу просто написать код, который выбивает первые 15 символов из строки, потому что их может быть слишком мало в некоторых случаях.

Мне бы очень хотелось что-то в C #, что позволило бы мне продолжить поиск строки после того, как найден первый результат, чтобы логика выглядела так:

 string my_string = "Lost or Stolen? Stolen";

 searchFor(@"Stolen" in my_string)
 {
      Found Stolen;
      Does it have "or " infront of it? yes;
      ignore and keep searching;
      Found Stolen again;
      return "Equipment stolen";
 }

Ответы [ 5 ]

3 голосов
/ 29 марта 2012

Пара вариантов здесь.Вы можете найти последний индекс пробела и взять оставшуюся часть строки:

string input = "Lost or Stolen? Stolen";
int lastSpaceIndex = input.LastIndexOf(' ');
string result = input.Substring(lastSpaceIndex + 1);
Console.WriteLine(result);

Или вы можете разделить его и взять последнее слово:

string input = "Lost or Stolen? Lost";
string result = input.Split(' ').Last();
Console.WriteLine(result);

Регулярное выражение такжевариант, но излишний, учитывая более простые решения выше.Хорошим сочетанием клавиш, подходящим для этого сценария, является использование опции RegexOptions.RightToLeft для получения первого совпадения, начиная справа:

string result = Regex.Match(input, @"\w+", RegexOptions.RightToLeft).Value;
2 голосов
/ 29 марта 2012

Если я понимаю ваше требование, вы ищете экземпляр Lost или Stolen после ?:

var q = myString.IndexOf("?");
var lost = q >= 0 && myString.IndexOf("Lost", q) > 0;
var stolen = q >= 0 && myString.IndexOf("Stolen", q) > 0;

// or
var lost = myString.LastIndexOf("Lost") > myString.IndexOf("?");
var stolen = myString.LastIndexOf("Stolen") > myString.IndexOf("?");

// don't forget
var neither = !lost && !stolen;
1 голос
/ 29 марта 2012

Вы можете найти строку «Lost» и, если она встречается дважды, вы можете подтвердить, что это «Lost».

0 голосов
/ 29 марта 2012

Если это работает для вашего случая использования, может быть проще использовать .EndsWith().

bool lost = my_string.EndsWith("Lost");
0 голосов
/ 29 марта 2012

В этом случае возможно, что вы могли бы использовать индекс для подстроки, зная, что она всегда скажет сначала потерянный или украденный

, так что вы анализируете потерянный или украденный, а затем как ваше ключевое словосоответствует оставшаяся строка.

что-то вроде:

int questionIndex = inputValue.indexOf("?");
string toMatch = inputValue.Substring(questionIndex);
if(toMatch == "Lost")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...