Парсинг строки в C#; существует ли более чистый путь?

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

Так что да, положительные и отрицательные примеры должны быть включены в пакет. И очень важно выбрать негативы. Но обычно прилагаются усилия, чтобы выбрать правильные негативы внутри партии, а не создавать партии определенным образом. Этот пост, объясняющий, как работает ранжирование потерь, может оказаться полезным https://gombru.github.io/2019/04/03/ranking_loss/

5
задан Metro Smurf 8 April 2009 в 02:46
поделиться

6 ответов

Вам не должна быть нужна первая замена, так как можно просто добавить 1 к" (" положение.

private static string DecipherUserName (string user) {           
    int start = user.IndexOf( "(" );
    if (start == -1)
        return user;
    return user.Substring (start+1).Replace( ")", string.Empty );
}
9
ответ дан 18 December 2019 в 05:18
поделиться

Regexes так полезны, что Вы сохраните себя тонна страдания, стиснувшего зубы и учащегося их. Не целая хижина, просто основы.

Один regex это будет работать, "\w + \((.*) \)", - jsmith был бы в Соответствии. Группы [1].

Один простой способ взять regexes состоит в том, чтобы найти веб-сайт, который это позволит Вам ввести в regex, и некоторый текст затем выложил соответствия...

20
ответ дан 18 December 2019 в 05:18
поделиться

Своего рода взлом... ^^

return user.Substring(user.IndexOf('(') + 1).TrimEnd(')');

Если user не содержит вводной круглой скобки, IndexOf() возвраты -1, мы добавляем один, получаем нуль, и SubString() возвращает целую строку. TrimEnd() не будет иметь никакого эффекта, если имя пользователя не заканчивается закрывающей скобкой.

Если user содержит вводную круглую скобку, IndexOf() возвращает его индекс, мы skipp вводная круглая скобка путем добавления один, и остальная часть извлечения строки с Substring(). Наконец мы удаляем закрывающую скобку с TrimEnd().

5
ответ дан 18 December 2019 в 05:18
поделиться

Если пользовательская строка всегда находится в форме "Joe Smith (jsmith)", это должно работать.

private static string DecipherUserName(string user)
{
    string[] names = user.Split(new char[] {'(', ')'});
    return names.Length > 2 ? names[1] : user;
}

И если пользовательской строкой всегда будет "Joe Smith (jsmith)", то это будет всегда работать.

private static string DecipherUserName(string user)
{
    return "jsmith";
}

Вторая запись в целях юмора только.

5
ответ дан 18 December 2019 в 05:18
поделиться

Я использовал бы

int start=user.IndexOf('(');
if (start != -1) {
  end = user.IndexOf(')', start);
  return user.Substring(start+1,end-start-1);
} else
  return user;

Но это - просто косметическое изменение: использование символов в IndexOf немного быстрее, и использование метода Подстроки, кажется, выражает более точно, что должно быть сделано (и метод более устойчив, если у Вас есть несколько пар круглых скобок...),

Тем не менее метод L Daniel (использование String.Split) могло бы быть более простым (но не имеет дело очень хорошо с уродливыми строками и должен создать массив строк).

В целом, я предложил бы, чтобы Вы преодолели свое отвращение к регулярным выражениям, так как та ситуация точно, что они предназначаются для :-)...

1
ответ дан 18 December 2019 в 05:18
поделиться

Так как функция IndexOf возвратится-1, когда значение не будет существовать, Вы могли сделать немного отличающиеся вещи...

private static string DecipherUserName( string user )
{           
   int start = user.IndexOf( "(" );

   if (start > -1)
   {
      return user.Substring( start ).Replace( "(", string.Empty ).Replace( ")", string.Empty );
   }
   else
   {
      return user;
   }
}
2
ответ дан 18 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: