You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提取两字符串间子串触发ArgumentOutOfRangeException问题求助

解决Selenium提取Profile ID时的ArgumentOutOfRangeException问题

我帮你定位到了两个核心问题,以及对应的修复方案:

问题1:结束匹配字符串错误

你当前使用的结束符"\","和页面源码里的实际格式不匹配。看你的页面源码片段:

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

profilePage_10216后面的内容是","(也就是"+,+"),但你代码里写的"\","实际对应的是","(少了一个闭合双引号),这直接导致IndexOf(end)返回-1,触发后续的截取异常。

问题2:GetInbetween方法无边界校验

你的自定义方法没有处理找不到起始/结束标记、结束标记在起始标记之前这些异常场景,当IndexOf返回-1时,直接进行字符串截取必然抛出ArgumentOutOfRangeException。


修复方案

第一步:修正结束匹配字符串

把调用代码里的结束符改成"\",\"",匹配源码里的","格式:

var source = GetSource();
var username = "username1";
Console.WriteLine("Here: " + source.GetInbetween(
    "window.__additionalDataLoaded('/" + username + "/',{\"logging_page_id\":\"", 
    "\",\"" // 修正后的结束符
));

第二步:改造GetInbetween方法,添加完整校验

给方法加上边界检查,避免无效的截取操作:

public static string GetInbetween(this string s, string start, string end)
{
    // 先检查输入参数合法性
    if (string.IsNullOrWhiteSpace(s) || string.IsNullOrWhiteSpace(start) || string.IsNullOrWhiteSpace(end))
        return null;

    int startIndex = s.IndexOf(start);
    // 找不到起始标记,直接返回null
    if (startIndex == -1)
        return null;

    int startPos = startIndex + start.Length;
    // 从起始标记之后的位置开始找结束标记,避免匹配到无关内容
    int endIndex = s.IndexOf(end, startPos);
    // 结束标记不存在,或者位置在起始标记之前,返回null
    if (endIndex == -1 || endIndex <= startPos)
        return null;

    // 用Substring更直观,也可以用C#8+的范围运算符:s[startPos..endIndex]
    return s.Substring(startPos, endIndex - startPos);
}

进阶方案:用JSON解析替代字符串匹配

字符串匹配很容易因为页面源码的微小变化(比如空格、换行、属性顺序调整)失效,更可靠的方式是提取JSON部分后解析:

using System.Text.Json;

var source = GetSource();
var username = "username1";
var startStr = $"window.__additionalDataLoaded('/{username}/',";
var endStr = ");";

// 先提取JSON片段
var jsonPart = source.GetInbetween(startStr, endStr);
if (!string.IsNullOrWhiteSpace(jsonPart))
{
    // 解析JSON获取Profile ID
    var jsonDoc = JsonDocument.Parse(jsonPart);
    var profileId = jsonDoc.RootElement.GetProperty("logging_page_id").GetString();
    Console.WriteLine("Profile ID: " + profileId); // 输出 profilePage_10216
}

内容的提问来源于stack exchange,提问作者user5405648

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:27:30