gruber
gruber

Reputation: 29729

best possible way to get given substring

lets say I have string in format as below:

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

What is the best way to get the value from the last bracket set [valx] ?

so for given example

[val1].[val2].[val3]

the result would be val3

Upvotes: 0

Views: 106

Answers (10)

Konrad Kokosa
Konrad Kokosa

Reputation: 16878

I would use regular expression, as they are the most clear from intention point of view:

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

Upvotes: -1

Yves Schelpe
Yves Schelpe

Reputation: 3463

For a quick solution to your problem (so not structural),

I'd say:

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

then using the Substring method

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

then removing the "]" with TrimEnd function

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

But this is by all means not the only solution, and not structural to apply.. Just one of many answers to your problem.

Upvotes: 2

Tobsey
Tobsey

Reputation: 3400

I'd use the below regex. One warning is that it won't work if there are unbalanced square brackets after the last pair of brackets. Most of the answers given suffer from that though.

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

string result;

if (m.Success)
{
    result = m.Value;
}

Upvotes: 0

Bolu
Bolu

Reputation: 8786

string input="[val1].[val2].[val3]";
int startpoint=input.LastIndexOf("[")+1;
string result=input.Substring(startpoint,input.Length-startpoint-1);

Upvotes: 0

kubari
kubari

Reputation: 36

    string str = "[val1].[val2].[val3]";
    string last = str.Split('.').LastOrDefault();
    string result = last.Replace("[", "").Replace("]", "");

Upvotes: 0

Th0rndike
Th0rndike

Reputation: 3436

I'm assuming you always need the last brace. I would do it like this:

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

Upvotes: 0

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186688

Providing, that none of val1...valN contains '.', '[' or ']' you can use a simple Linq code:

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

Or if all you want is the last value:

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

Upvotes: 0

Tim Schmelter
Tim Schmelter

Reputation: 460108

You have to define best first, best in terms of readability or cpu-cycles?

I assume this is efficient and readable enough:

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

or with Substring which can be more efficient, but it's not as safe since you have to handle the case that's there no dot at all.

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

So you need to check this first:

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

Upvotes: 4

Sebi
Sebi

Reputation: 3979

You can use following:

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

Now you can access via index. For last you can use myStrings[myStrings.length - 1]

Upvotes: 0

CodeTherapist
CodeTherapist

Reputation: 2806

I think you want to access the valx. The easiest solution that comes in my mind is this one:

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

Upvotes: 0

Related Questions