Как я могу обрезать строки до первого вхождения ";" или "[" - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть строки c #, которые выглядят следующим образом:

"かたむく;かたぶく[ok]"
"そば[側,傍];そく[側];はた"
"くすり"
"おととい[gikun];おとつい[gikun];いっさくじつ"

Как я могу обрезать их так, чтобы в выводе был только текст до первого появления символа ";" (не обычная точка с запятой)) или "[", или если ни того, ни другого нет, тогда новая строка будет такой же, как и существующая.

"かたむく"
"そば"
"くすり"
"おととい"

Это то, что лучше всего сделать с Regex, или я должен использовать какой-то тип indexOfкод для этого?

Ответы [ 3 ]

2 голосов
/ 06 ноября 2019

Вам не нужно Regex, просто string.IndexOfAny. Что-то вроде:

 var inputs = new[]
 {
     "かたむく;かたぶく[ok]",
     "そば[側,傍];そく[側];はた",
     "くすり",
     "おととい[gikun];おとつい[gikun];いっさくじつ"
 };

 var separators = new[] {' ', '['};

 foreach (var input in inputs)
 {
     var separatorPosition = input.IndexOfAny(separators);
     if (separatorPosition >= 0)
     {
         Debug.WriteLine($"Split: {input.Substring(0, separatorPosition)}");
     }
     else
     {
         Debug.WriteLine($"No Split: {input}");
     }

 }

Я получаю следующий вывод из ваших входных данных:

Split: かたむく;かたぶく
Split: そば
No Split: くすり
Split: おととい

Это не совсем соответствует тому, что вы показываете, но я думаю, что это правильно (и то, что вы показываете)нет)

1 голос
/ 06 ноября 2019

Метод расширения с небольшой проверкой выполнит эту работу.

public static string GetUntil(this string input, char[] delimiters)
{
   if (input == null || input.IndexOfAny(delimiters) == -1)
      return input;
   else
      return input.Split(delimiters)[0];
}

, затем вызовите как:

var test = "かたむく;かたぶく[ok]".GetUntil(new char[] { ' ', '[' });
1 голос
/ 06 ноября 2019

Расширяя мой комментарий, "IndexOf может использоваться для поиска первого индекса символа [, а Substring может возвращать строку до этой точки."

public static string GetSubstringToChar(string input, char delimeter = '[')
{
    if (input == null || !input.Contains(delimeter)) return input;
    return input.Substring(0, input.IndexOf(delimeter));
}

Чтобы это работало с несколькими разделителями, мы можем передать массив символов разделителей и использовать IndexOfAny:

public static string GetSubstringToChar(string input, char[] delimeters)
{
    if (input == null || !input.Any(delimeters.Contains)) return input;
    return input.Substring(0, input.IndexOfAny(delimeters));
}

Затем вы можете вызвать это как:

var strings = new List<string>
{
    "かたむく;かたぶく[ok]",
    "そば[側,傍];そく[側];はた",
    "くすり",
    "おととい[gikun];おとつい[gikun];いっさくじつ",
};

var delimeters = new[] { ';', '[' };

foreach (var str in strings)
{
    Console.WriteLine(GetSubstringToChar(str, delimeters));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...