как к подстроке от строки с помощью c#?

формат строки всегда похож на это "FirstName=ABC; LastName=XZY; Username=User1; Password=1234".

Мне нужно единственное значение UserName (который является 'User1' в этом случае). Я хочу достигнуть этого в минимальной строке кода с помощью метода подстроки (или что-то еще).

Помощь?

6
задан Jon Seigel 22 February 2010 в 19:20
поделиться

9 ответов

Этот метод будет работать, даже если пары значений указаны в другом порядке. Он разделяется на точку с запятой, находит элемент с «Имя пользователя», а затем возвращает то, что стоит после знака равенства.

string theString = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string username = theString.Split(";").Where(s => s.Split("=")[0].Equals("Username")).ToArray()[0].Split("=")[1];
4
ответ дан 8 December 2019 в 02:06
поделиться

Ради полноты, вот является Regex способом сделать его. Это будет также работать, если порядок изменится.

// using System.Text.RegularExpressions;

string test1 = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string test2 = "FirstName=ABC;LastName=XZY;Password=1234;Username=User1";
string test3 = "FirstName=ABC;LastName=XZY;Password=1234";

string regexPattern = @"(?<=Username=)[^;\n]*";
var userName1 = Regex.Match(test1, regexPattern).Value; // User1
var userName2 = Regex.Match(test2, regexPattern).Value; // User1
var userName3 = Regex.Match(test3, regexPattern).Value; // string.Empty

// Compiling can speed up the Regex, at the expense of longer initial Initialization
// Use when this is called often, but measure.

Regex compiledRx = new Regex(regexPattern,RegexOptions.Compiled);
var userNameCompiled1 = compiledRx.Match(test1).Value; // User1
var userNameCompiled2 = compiledRx.Match(test2).Value; // User1
var userNameCompiled3 = compiledRx.Match(test3).Value; // string.Empty
15
ответ дан 8 December 2019 в 02:06
поделиться

Похоже на строку с разделителями, поэтому это будет работать:

string result = myString.Split(';')[2].Split('=')[1];

Однако, если кто-то изменит порядок пар значений, это сломается.

Есть более эффективные способы решения этой проблемы, которые не будут нарушены, если порядок изменится, количество параметров изменится и т. Д. - например, регулярное выражение, опубликованное Майклом, или запросы Linq, отправленные несколькими людьми.

12
ответ дан 8 December 2019 в 02:06
поделиться

, В то время как ответы разделения 'в порядке', если ничто никогда не изменяется, вероятно, лучше использовать функцию потому что:

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

(Даже если вы просто помещаете одно разделение строки в функцию! или по крайней мере добавьте комментарий к разделению.)


static String GetUsername(String value)
{
    String result = "";
    String token = "Username=";

    int index = value.IndexOf(token) + token.Length;
    while (value[index] != ';')
    {
        result += value[index++];
        if (index > value.Length - 1)
            break;
    }

    return result;
}
3
ответ дан 8 December 2019 в 02:06
поделиться

Однако это не так просто, как использование split:

string input = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string username = Regex.Match(input, "Username=(?<username>.*?)(;|$)").Groups["username"].Value;

В этом случае группы могут располагаться в любом порядке.

И, если вы хотите проявить творческий подход:

var answers = from tuple in input.Split(';')
              where tuple.StartsWith("Username=")
              select tuple.Split('=')[1];

username = answers.Count() > 0 ? answers.First() : string.Empty;

Можно сказать, что последняя часть имеет лучшую семантику.

РЕДАКТИРОВАТЬ: Обновите последнюю часть, чтобы иметь дело с входными строками, у которых нет требуемого кортежа.

3
ответ дан 8 December 2019 в 02:06
поделиться
        string t = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
        string name = t.Split(';')[2].Split('=')[1];
1
ответ дан 8 December 2019 в 02:06
поделиться

Это не самый короткий... но, вероятно, один из самых быстрых.

string value = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
int offset = value.IndexOf("Username=") + 9;
if (offset < 9)
    throw new Exception("Username= not found in string");
int len = value.IndexOf(';', offset) - offset;
if (len < 0)
    len = value.Length - offset;
string find = value.Substring(offset, len);

... if (len < 0) нужен для того, чтобы Имя пользователя находилось в конце строки и не заканчивалось точкой с запятой. Если вы хотите игнорировать регистр, вы можете заменить строку int offset на эту...

int offset = value.ToUpperInvariant().IndexOf("USERNAME=") + 9;
1
ответ дан 8 December 2019 в 02:06
поделиться

C, C++ и Ada упоминаются здесь (да, авторы не могут оприходовать "Ada"). Код C может быть записан вручную или сгенерирован с помощью Scade .

-121--2270220-

Я занимался той же проблемой. До сих пор моим лучшим решением было получить идентификатор родительского процесса (getppid ()) и использовать его во временном файле, в который я могу поместить список файлов из commitinfo. Этот родительский идентификатор, по-видимому, одинаков для процесса verifymsg (по крайней мере, в AIX). Удачи.

-121--4860182-

Вот альтернативное решение (не слишком отличающееся от других, но которое, я думаю, более простое), которое будет работать независимо от порядка.

var input = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";

Assert.AreEqual("User1", input
    .Split(';')
    .Select(item => item.Split('='))
    .Where(pair => pair[0].Equals("Username"))
    .Single()[1]);
7
ответ дан 8 December 2019 в 02:06
поделиться

Ух ты - люди действительно хотят заставить jQuery хитрость в этот - вы можете сделать все это с CSS. От stopdesign :

При создании жидких макетов с использованием CSS, вот несколько соображений, которые я имею в виду:

  • Double-div columns: Как бы я не хотел использовать дополнительную разметку, нет лучшего способа обеспечить максимальную совместимость между несколькими браузерами, чем использовать два divs для каждого столбца. Внешние перегородки используются для задания ширины. Внутренние дивы используются для установки заполнения для создания желобов белого пространства между каждым столбцом.

  • Используйте желоба фиксированной ширины (или ширины желоба в зависимости от размера типа): Когда ширина столбца применяется независимо от заполнения столбца, как описано выше, для ширины можно использовать проценты, а для заполнения - пикселы или ems. Это, не беспокоясь о том, что одна колонка упирается в нижнюю часть другой, или без преднамеренного занижения размеров колонн, чтобы они всегда помещались на странице. Несмотря на то, что ширина столбцов изменяется по мере расширения или сужения браузера, текст на странице обычно остается одного размера. Размер пробела, необходимый для удобства текста, больше зависит от размера типа, а не от размера столбца, содержащего этот текст.

  • Избегайте столбцов фиксированной ширины: по мере возможности, сделайте все столбцы процентной шириной. Заманчиво думать о боковых полосах и навигационных столбцах как о одной статической ширине, и пусть главный или средний столбец делает все расширяющееся. Это быстро уничтожает любые пропорции, которые могли быть тщательно выбраны, так как колонны фиксированной ширины могут выглядеть капризными и слабыми при больших разрешениях. Или широкие боковые панели фиксированной ширины могут стать трудновыполнимыми, перегружая основной столбец при более узкой ширине браузера.

Хитрость состоит в том, чтобы создать сверхширокое фоновое изображение (или два изображения для 3-столбчатых макетов, таким образом, скользящие двери - характер техники). Изображение частично непрозрачное, частично прозрачное. Она замощается вертикально внутри родительского контейнера, как и техника Дэна Faux Columns. Непрозрачная часть изображения должна соответствовать процентам столбца, который она помогает создать, чтобы его можно было позиционировать с одинаковым значением фонового положения. Это позволяет переходить от непрозрачного к прозрачному, чтобы стать точкой оси для положения фона. Положение непрозрачной части в изображении может быть изменено на основе порядка содержания в HTML для получения почти любого желаемого эффекта.

-121--1880585-

Пробовали ли вы набор средств совместимости приложений корпорации Майкрософт ? Он анализирует ваше приложение и предоставляет прокладки совместимости, которые могут помочь решить вашу проблему.

-121--1387784-

Наименьшее число строк кода не всегда является лучшей метрикой, но вы можете сделать то, что вам нужно с Regex.

4
ответ дан 8 December 2019 в 02:06
поделиться
Другие вопросы по тегам:

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