Какой лучший способ пропустить символы перед подчеркиванием (_) в строке, используя c # - PullRequest
4 голосов
/ 06 октября 2011

Какой самый лучший способ пропустить символы перед подчеркиванием _ в строке, используя c #?

например: case 1 Строка содержит _

string s="abc_defg" 

Я хочу получить defg для другой строки

дело 2

иногда строка не содержит _. в то время мне нужно получить всю строку

например.

s="defg"

В обоих случаях я хочу получить "defg". Фильтрация применяется только в том случае, если в строке есть подчеркивание. Как я могу это сделать

Ответы [ 5 ]

6 голосов
/ 06 октября 2011

Я не знаю, как определить наилучший способ, но это работает, если только одно подчеркивание.

string s1 = "abc_defg";
string s2 = "defg";

Console.WriteLine( s1.Split('_').Last() );
Console.WriteLine( s2.Split('_').Last() );

Если вам нужна большая гибкость, вы можете взглянуть на регулярные выражения.

Regex.Replace(s1, "^.*_", "")
6 голосов
/ 06 октября 2011
string s="abc_defg";
int ix = s.IndexOf('_');
s = ix != -1 ? s.Substring(ix + 1) : s;

Использование тернарного оператора здесь совершенно бесполезно, лучше написать:

s = s.Substring(ix + 1);

напрямую, используя тот факт, что Substring, вероятно, оптимизирован для индекса случая == 0

Это то, что вы хотите?

НО кто-то предложил использовать пушки LINQ, поэтому

var temp = s.SkipWhile(p => p != '_').Skip(1);
s = temp.Any() ? new string(temp.ToArray()) : s;

В .NET 4.0 есть новый метод string.Concat.

s = temp.Any() ? string.Concat(temp) : s;

(обратите внимание, что, как правило, способ LINQ медленнее и сложнее для чтения)

Я добавлю ультракилл: регулярные выражения !!!Существует школа мысли, что с помощью регулярных выражений можно сделать все что угодно ИЛИ jQuery!: -)

var rx = new Regex("(?:[^_]*_)?(.*)", RegexOptions.Singleline);
var res = rx.Match(s).Groups[1].Value;

Я даже не буду пытаться никому объяснить этого зверя, так что не спрашивайте.Это бесполезно.(и регулярное выражение и спросить :-))

2 голосов
/ 06 октября 2011

простая функция, возможно:

public string TakeStringAfterUnderscoreOrWholeString(string  input)
{
   var underscorePos = input.IndexOf("_");
   return underscorePos  == -1 ? input : input.Substring(underscorePos+1);
}

Живая проверка: http://rextester.com/rundotnet?code=AVQO61388

2 голосов
/ 06 октября 2011

Вы можете использовать LINQ SkipWhile () :

textValue.SkipWhile(c => c != separator)
         .Skip(1)

Окончательное решение для обоих случаев:

string textValue = "abc_defg";
char separator = '_';
string result = textValue.IndexOf(separator) >= 0 
                ? new String(textValue.SkipWhile(c => c != separator)
                                      .Skip(1)
                                      .ToArray())
                : textValue;

EDIT:

Я прав с комментарием xanatos, но в любом случае иногда бывает интересно найти разные решения:)

0 голосов
/ 06 октября 2011

Я бы предложил просто использовать для этой цели строковую [] arr и функцию split.

string[] arr=s.split('_');
string out=arr[arr.Length-1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...