user5405648
user5405648

Reputation:

Get substring in between two other strings?

I am trying to get a string in between two sub strings, but I am running into an issue.

I am trying to use Selenium to automate a web test, and extract the profile ID from the javascript in the page source. I am running into an ArgumentOutOfRangeException?

It doesn't matter with I'm searching for the correct or wrong values and passing them to GetInbetween, it throws this exception. I cannot see anything wrong with my code, so here I am.

Code:

var source = GetSource();
var username = "username1";

Console.WriteLine("Here: " + source.GetInbetween("window.__additionalDataLoaded('/" + username + "/',{\"logging_page_id\":\"", "\","));

Source (truncated for readability):

window.__additionalDataLoaded('/username1/',{"logging_page_id":"profilePage_10216","logging_page_username": "username1"})

Exception:

ArgumentOutOfRangeException 
Length cannot be less than zero. (Parameter 'length') 

It throws the exception in this method

public static string GetInbetween(this string s, string start, string end)
{
    return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end)];
}   

LinqPad test:

void Main()
{
    var source = "window.__additionalDataLoaded('/username1/',{\"logging_page_id\":\"profilePage_10216\",\"logging_page_username\":\"username1\"})";
    var username = "username1";
    
    Console.WriteLine(source.IndexOf("window.__additionalDataLoaded('/" + username + "/',{\"logging_page_id\":\""));
    Console.WriteLine(source.IndexOf("\","));
    
    Console.WriteLine($"[{source}]");
    Console.WriteLine($"[{"window.__additionalDataLoaded('/" + username + "/',{\"logging_page_id\":\""}]");
    Console.WriteLine("Here: " + source.GetInbetween("window.__additionalDataLoaded('/" + username + "/',{\"logging_page_id\":\"", "\"."));
}

Upvotes: 0

Views: 142

Answers (3)

user5405648
user5405648

Reputation:

Passing a start index to IndexOf(end) like this seems to fix it.

return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end, s.IndexOf(start))];

The final method looks like this:

public static string GetInbetween(this string s, string start, string end)
{
    return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end, s.IndexOf(start))];
}

Upvotes: 0

Milney
Milney

Reputation: 6417

It says 'Length cannot be less than zero.' which means IndexOf is returning -1, which it does if the substring is not found in the search string... So you are looking for a substring which doesn't exist in the string. Make sure you have case-sensitivity correct, or use an IndexOf overload which ignores case.

Edit -- Your GetSource() method must not be returning the string you think it is returning... See, works fine explicitly searching that string:

enter image description here

Upvotes: 0

Christian
Christian

Reputation: 1260

You might get this error if end exists in s before start. So try using s.LastIndexOf(end).

Upvotes: 2

Related Questions