Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在其他两个字符串之间获取子字符串?_C# - Fatal编程技术网

C# 在其他两个字符串之间获取子字符串?

C# 在其他两个字符串之间获取子字符串?,c#,C#,我试图在两个子字符串之间获得一个字符串,但遇到了一个问题 我试图使用Selenium自动化web测试,并从页面源代码中的javascript提取概要文件ID。我遇到了一个ArgumentOutOfRangeException 这与我搜索正确或错误的值并将它们传递给GetInbetween无关,它会引发此异常。我看不出我的代码有什么问题,所以我来了 代码: 源(为了可读性而截断): 例外情况: ArgumentOutOfRangeException Length cannot be less t

我试图在两个子字符串之间获得一个字符串,但遇到了一个问题

我试图使用Selenium自动化web测试,并从页面源代码中的javascript提取概要文件ID。我遇到了一个
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代码中,“
to
IndexOf
以获得81的结果,但您将
传递给您的
getInBeween
方法。第一个方法没有逗号,第二个方法有句点。如果将带句点的方法传递给
IndexOf
则结果为-1。在LinqPad代码中,您传递的是
“\”,”
IndexOf
以获得81的结果,但您通过了
“\”。“
到您的
Getinbetween
方法。不是第一个有逗号,第二个有句点。如果将带句点的一个传递给
IndexOf
,则结果为-1。这不会有什么区别,因为在您的示例中
start
的索引为0。更可能的情况是,您使用正确的
end
值运行此操作,而不是使用您发布的代码中的拼写错误。您确实应该检查两个IndexOf调用是否都返回-1,并确定如何处理
end
索引在
start
索引之前加上长度的情况。这没有什么区别,因为在您的示例中
start
的索引是0。更可能的情况是,您使用正确的
end
值运行此操作,而不是使用您发布的代码中的拼写错误。您确实应该检查IndexOf调用是否都返回-1,并确定如何处理
end
索引位于
start
索引加上长度之前的情况。