【问题标题】:Capture Regex repeating string between slashes in URL捕获 URL 中斜线之间的正则表达式重复字符串
【发布时间】:2017-10-29 08:41:35
【问题描述】:

我有以下部分 URL,可以是

/it/xyz/test/param+1/param-2/1234/gfd4

基本上两个字母开头一个斜线另一个未知字符串,然后是斜线之间的一系列可重复字符串 我需要捕获每个字符串(我知道用 / 分隔符分割会很好,但我很想知道如何用正则表达式提取)。我首先提出了这个:

^\/([a-zA-Z]{2})\/([a-zA-Z]{1,10})(\/[a-zA-Z1-9\+\-]+)

但它只捕获

group1: 它 组2:xyz 第三组:/测试

当然它会忽略字符串的其余部分。

如果我在末尾添加 * 号,它只会捕获最后一句话:

^\/([a-zA-Z]{2})\/([a-zA-Z]{1,10})(\/[a-zA-Z1-9\+\-]+)*

group1: 它 组2:xyz 组3:/gfd4

所以,我显然遗漏了一些基础知识,所以除了正确的正则表达式之外,我还想解释一下。

我标记为 Java 是因为解析正则表达式的引擎是 JDK 7。据我所知,每个引擎都可能存在差异。

【问题讨论】:

    标签: java regex string


    【解决方案1】:

    作为mentioned here,这是意料之中的:

    模式中有一个组,您只能在该组中获得一个确切的结果。
    如果您的捕获组被模式重复(您在周围的非捕获组上使用了 + 量词),则仅存储与它匹配的最后一个值。

    我宁愿捕获 group3 中字符串的其余部分((\/.*$),如 in this demo),然后在“/”周围使用拆分。或者在字符串的其余部分应用 yhat 模式:

    Pattern p = Pattern.compile("(\/[a-zA-Z1-9\+\-]+)");
    Matcher m = p.matcher(str);
    while (m.find()) {
        String place = m.group(1);
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      相关资源
      最近更新 更多