2014-01-10 2 views
0

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

[val1].[val2].[val3] ... 

Что является лучшим способом, чтобы получить значение из последнего кронштейна установлен [valx]?

так для данного примера

[val1].[val2].[val3] 

результат будет val3

ответ

4

Вы должны определить лучше первым, лучшим с точки зрения читаемости или CPU-циклов?

Я предполагаю, что это является эффективным и достаточно читаемым:

string values = "[val1].[val2].[val3]"; 
string lastValue = values.Split('.').Last().Trim('[',']'); 

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

lastValue = values.Substring(values.LastIndexOf('.') + 1).Trim('[',']'); 

Таким образом, вы должны проверить это первым:

int indexOflastDot = values.LastIndexOf('.'); 
if(indexOflastDot >= 0) 
{ 
    lastValue = values.Substring(indexOflastDot + 1).Trim('[',']'); 
} 
+1

Если нет точки, 'LastIndexOf' возвращает -1, что отлично работает, нет? – Rawling

+0

@Rawling: Я уже добавил это как комментарий, но теперь я также показал, как вы можете его проверить. –

+0

Нет, я имею в виду, что это * ОК *, если нет точки, потому что вы просто закончите тем, что вызываете '.Substring (0)' – Rawling

0

Я предполагаю, что вы всегда нужны последнюю скобку. Я хотел бы сделать это следующим образом:

string input = "[val1].[val2].[val3]"; 
string[] splittedInput = input.split('.'); 
string lastBraceSet = splittedInput[splittedInput.length-1]; 
string result = lastBraceSet.Substring(1, lastBraceSet.Length - 2); 
+1

... и разделите [] -значения от этого: string result = lastBraceSet.Substring (1, lastBraceSet.Length - 2); – tehvan

+0

@tehvan спасибо, отредактирован. – Th0rndike

0

Я думаю, что вы хотите получить доступ к valx. Самое простое решение, которое приходит на мой взгляд, это одна:

 public void Test() 
     { 
      var splitted = "[val1].[val2].[val3]".Split('.'); 
      var val3 = splitted[2]; 
     } 
0

Вы можете использовать следующие:

string[] myStrings = ("[val1].[val2].[val3]").Split('.'); 

Теперь вы можете получить доступ через индекс. За последней можно использовать myStrings[myStrings.length - 1]

2

Для быстрого решения вашей проблемы (так не структурной),

Я бы сказал:

var startIndex = input.LastIndexOf(".["); // getting the last 

затем с помощью метода Substring

var value = input.Substring(startIndex + 2, input.Length - (startIndex - 2)); // 2 comes from the length of ".[". 

после снятия с охраны "]" с использованием функции TrimEnd

var value = value.TrimEnd(']'); 

Но это непременно не единственное решение, а не структурное применение .. Только один из многих ответов на вашу проблему.

+1

+1, 'Split' не самый эффективный способ, когда вам нужен только последний элемент. – Rawling

+1

некоторая проблема с этим кодом: 'SubString' должен быть' Substring', должен использовать 'startIndex + 2' в качестве отправной точки и' input.Length- (startIndex + 2) 'как десятую часть подстроки или использовать' StartIndex = input.LastIndexOf ("[") + 2'. И последнее: 'TrimEnd (']')' – Bolu

+0

thx для указания @Bolu! Просто сделал быструю запись с моей головы, у меня не было компилятора или идее ... Я отредактирую его, но в будущем не стесняйтесь редактировать его самостоятельно, а также StackOverflow. –

-1

Я хотел бы использовать регулярное выражение, так как они являются наиболее ясно из намерения точки зрения:

string input = "[val1].[val2].[val3] ..."; 
string match = Regex.Matches(input, @"\[val\d+\]") 
        .Cast<Match>() 
        .Select(m => m.Value) 
        .Last(); 
+1

Ух, ой ... самый уродливый код, который я когда-либо видел – sasjaq

+0

Я никогда не находил регулярное выражение, чтобы быть более четким, чем раскол или подстрока. – paqogomez

+0

@sasjaq, @paqogomez, я очень удивлен, но ваш пробег может варьироваться, конечно. Я нашел поиск шаблона 'val \ d +' и взяв последнее совпадение (что точно говорит этот код на первый взгляд) гораздо более ясно, чем интерпретировать комбинацию 'Split',' Trim', 'Last' и т. Д. –

0

Обеспечение, что ни один из знач1 ...valN содержит'.', '[' or ']' вы можете использовать простой Linq код:

String str = @"[val1].[val2].[val3]"; 
    String[] vals = str.Split('.').Select((x) => x.TrimStart('[').TrimEnd(']')).ToArray(); 

Или, если все, что вы хотите, последнее значение:

String str = @"[val1].[val2].[val3]"; 
    String last = str.Split('.').Last().TrimStart('[').TrimEnd(']'); 
+0

вы уверены, что разделитесь с пространством? 'str.Split ('')' – sasjaq

+1

@sasjaq: Спасибо! Конечно, должно быть «.», Мне жаль, что я ошибаюсь –

0
string str = "[val1].[val2].[val3]"; 
    string last = str.Split('.').LastOrDefault(); 
    string result = last.Replace("[", "").Replace("]", ""); 
0
string input="[val1].[val2].[val3]"; 
int startpoint=input.LastIndexOf("[")+1; 
string result=input.Substring(startpoint,input.Length-startpoint-1); 
0

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

string s = "[val1].[val2].[val3]" 
string pattern = @"(?<=\[)[^\]]+(?=\][^\[\]]*$)" 
Match m = Regex.Match(s, pattern) 

string result; 

if (m.Success) 
{ 
    result = m.Value; 
} 
Смежные вопросы