C# 在其他两个字符串之间获取子字符串?
我试图在两个子字符串之间获得一个字符串,但遇到了一个问题 我试图使用Selenium自动化web测试,并从页面源代码中的javascript提取概要文件ID。我遇到了一个C# 在其他两个字符串之间获取子字符串?,c#,C#,我试图在两个子字符串之间获得一个字符串,但遇到了一个问题 我试图使用Selenium自动化web测试,并从页面源代码中的javascript提取概要文件ID。我遇到了一个ArgumentOutOfRangeException 这与我搜索正确或错误的值并将它们传递给GetInbetween无关,它会引发此异常。我看不出我的代码有什么问题,所以我来了 代码: 源(为了可读性而截断): 例外情况: ArgumentOutOfRangeException Length cannot be less t
ArgumentOutOfRangeException
这与我搜索正确或错误的值并将它们传递给GetInbetween
无关,它会引发此异常。我看不出我的代码有什么问题,所以我来了
代码:
源(为了可读性而截断):
例外情况:
ArgumentOutOfRangeException
Length cannot be less than zero. (Parameter 'length')
它在这个方法中抛出异常
public static string GetInbetween(this string s, string start, string end)
{
return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end)];
}
LinqPad测试:
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\":\"", "\"."));
}
它表示“长度不能小于零”。这意味着IndexOf返回-1,如果在搜索字符串中找不到子字符串,则返回-1。。。因此,您正在寻找字符串中不存在的子字符串。确保区分大小写正确,或使用忽略大小写的IndexOf重载 编辑--GetSource()方法不能返回您认为它正在返回的字符串。。。请参见,显式搜索该字符串效果良好:
它说“长度不能小于零”。这意味着IndexOf返回-1,如果在搜索字符串中找不到子字符串,则返回-1。。。因此,您正在寻找字符串中不存在的子字符串。确保区分大小写正确,或使用忽略大小写的IndexOf重载 编辑--GetSource()方法不能返回您认为它正在返回的字符串。。。请参见,显式搜索该字符串效果良好:
如果在
s
开始之前的中存在end
,则可能会出现此错误。因此,尝试使用s.LastIndexOf(end)
如果s
中的end
存在于start
之前,则可能会出现此错误。因此,尝试使用s.LastIndexOf(end)
将开始索引传递给IndexOf(end)
,这样似乎可以解决这个问题
return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end, s.IndexOf(start))];
最后一种方法如下所示:
public static string GetInbetween(this string s, string start, string end)
{
return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end, s.IndexOf(start))];
}
像这样将开始索引传递给IndexOf(end)
似乎可以解决这个问题
return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end, s.IndexOf(start))];
最后一种方法如下所示:
public static string GetInbetween(this string s, string start, string end)
{
return s[(s.IndexOf(start) + start.Length)..s.IndexOf(end, s.IndexOf(start))];
}
两个子字符串都存在,我已经手动确认了这一点。区分大小写并不重要,因为javascript与代码中的子字符串处于相同的情况,也是手动确认的。我将尝试并调试GetInbetween
方法。@AAA-您确认了错误,因为它对我来说工作正常-请参阅我的编辑。尝试执行var source=“”,并显式地将其放入。您的GetSource()函数显然没有返回您认为是的字符串。我使用了字符串文字作为源,并从indexOf(getInBeween的第一个参数和第二个参数)获得了这些结果:0和81两个子字符串都存在,我已经手动确认了这一点。区分大小写并不重要,因为javascript与代码中的子字符串处于相同的情况,也是手动确认的。我将尝试并调试GetInbetween
方法。@AAA-您确认了错误,因为它对我来说工作正常-请参阅我的编辑。尝试执行var source=“”,并显式地将其放入。您的GetSource()函数显然没有返回您认为是使用字符串文字作为源的字符串,并从indexOf(getInBeween的第一个参数和第二个参数)获得这些结果:0和81@Milney它肯定会抛出这个错误,正如我使用.netfiddle()@Milney确认的那样,如果切片在8到3之间,结果长度为-5,我假设它可能引发这样一个异常。使用LastIndexOf
返回start
之后的所有内容。例如:profilePage\u 10216”,“logging\u page\u username:“username1”})
@Milney它肯定会引发这个错误,正如我使用.netfiddle()确认的那样@Milney如果切片介于8和3之间,则结果长度将为-5,我认为这可能引发这样的异常。使用LastIndexOf
返回start
之后的所有内容。例如:profilePage\u 10216”,“logging\u page\u username:“username1”}
在您传递的LinqPad代码中,“
toIndexOf
以获得81的结果,但您将传递给您的getInBeween
方法。第一个方法没有逗号,第二个方法有句点。如果将带句点的方法传递给IndexOf
则结果为-1。在LinqPad代码中,您传递的是“\”,”
到IndexOf
以获得81的结果,但您通过了“\”。“
到您的Getinbetween
方法。不是第一个有逗号,第二个有句点。如果将带句点的一个传递给IndexOf
,则结果为-1。这不会有什么区别,因为在您的示例中start
的索引为0。更可能的情况是,您使用正确的end
值运行此操作,而不是使用您发布的代码中的拼写错误。您确实应该检查两个IndexOf调用是否都返回-1,并确定如何处理end
索引在start
索引之前加上长度的情况。这没有什么区别,因为在您的示例中start
的索引是0。更可能的情况是,您使用正确的end
值运行此操作,而不是使用您发布的代码中的拼写错误。您确实应该检查IndexOf调用是否都返回-1,并确定如何处理end
索引位于start
索引加上长度之前的情况。