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

Android Java/Kotlin正则捕获指定URL参数的所有匹配值

Android Java/Kotlin 捕获URL指定参数取值的解决方案

问题核心

你当前的正则只能返回最后一个匹配值,原因是采用了整个查询串的整体匹配逻辑,Java/Kotlin的正则引擎中重复捕获组仅会保留最后一次匹配结果。要获取所有目标参数值,需通过循环匹配单个参数键值对来实现。

解决方案

正则表达式调整

使用以下正则匹配单个目标参数的键值对,不受参数顺序影响,自动排除非目标参数:

(?:^|&)(type|data|reason)=([0-9a-z:.%\-]+)
  • (?:^|&):非捕获组,匹配查询串起始位置或参数分隔符&,确保匹配完整参数
  • (type|data|reason):捕获目标参数名(若无需参数名可忽略该分组)
  • ([0-9a-z:.%\-]+):捕获参数值,支持数字、小写字母及. : % -符号

Java 实现示例

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlParamExtractor {
    public static List<String> extractTargetParams(String url) {
        List<String> paramValues = new ArrayList<>();
        Pattern pattern = Pattern.compile("(?:^|&amp;)(type|data|reason)=([0-9a-z:.%\\-]+)");
        Matcher matcher = pattern.matcher(url);
        
        while (matcher.find()) {
            // 提取第二个分组的参数值
            paramValues.add(matcher.group(2));
        }
        return paramValues;
    }

    public static void main(String[] args) {
        // 示例1
        String url1 = "/sometexthere/moretexthere?type=1234&amp;data=56357782&amp;noextract=6532";
        System.out.println(extractTargetParams(url1)); // 输出 [1234, 56357782]
        
        // 示例2
        String url2 = "/sometexthere/moretexthere?data=56357782&amp;noextract=6532&amp;type=1234";
        System.out.println(extractTargetParams(url2)); // 输出 [56357782, 1234]
        
        // 示例3
        String url3 = "/sometexthere/moretexthere?reason=1234";
        System.out.println(extractTargetParams(url3)); // 输出 [1234]
    }
}

Kotlin 实现示例

import java.util.regex.Pattern

fun extractTargetParams(url: String): List<String> {
    val paramValues = mutableListOf<String>()
    val pattern = Pattern.compile("(?:^|&amp;)(type|data|reason)=([0-9a-z:.%\\-]+)")
    val matcher = pattern.matcher(url)
    
    while (matcher.find()) {
        paramValues.add(matcher.group(2))
    }
    return paramValues
}

fun main() {
    // 示例1
    val url1 = "/sometexthere/moretexthere?type=1234&amp;data=56357782&amp;noextract=6532"
    println(extractTargetParams(url1)) // 输出 [1234, 56357782]
    
    // 示例2
    val url2 = "/sometexthere/moretexthere?data=56357782&amp;noextract=6532&amp;type=1234"
    println(extractTargetParams(url2)) // 输出 [56357782, 1234]
    
    // 示例3
    val url3 = "/sometexthere/moretexthere?reason=1234"
    println(extractTargetParams(url3)) // 输出 [1234]
}

补充说明

  • 通过while (matcher.find())循环遍历所有匹配项,逐个提取参数值并收集
  • 若原始URL使用未转义的&而非&amp;,只需将正则中的&amp;替换为&即可
  • 若需同时获取参数名和值,可保留第一个分组matcher.group(1),返回键值对集合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:44