如何捕获多个重复的组?

184
我需要捕获多个相同模式的组。假设我有以下字符串:
HELLO,THERE,WORLD

我已经写了下面的模式
^(?:([A-Z]+),?)+$

我想要的是捕获每一个单词,所以第一组是:"HELLO",第二组是:"THERE",第三组是:"WORLD"。但是我的正则表达式实际上只捕获到最后一个,也就是"WORLD"。
我正在测试我的正则表达式here,我想要在Swift中使用它(也许在Swift中有一种方法可以获取中间结果,这样我就可以使用它们?)
我不想使用split。我只需要知道如何捕获与模式匹配的所有组,而不仅仅是最后一个。

8
为什么不以逗号分割? - rock321987
为什么不使用[A-Z]+[^,]+来捕获结果? - rock321987
需要更多的输入和输出... 还不够清楚。 - rock321987
7
rock321987,有什么不清楚的吗?我希望字符串中的每个单词都成为一个匹配组,但是我的模式只捕获了最后一个单词("WORLD")。 - phbelov
1
使用此答案查找所有匹配项:https://dev59.com/aF4c5IYBdhLWcg3weaT8#27880748 - rock321987
显示剩余4条评论
11个回答

0

抱歉,不是Swift,只是在手边最接近的语言中的一个概念验证。

// JavaScript POC. Output:
// Matches:  ["GOODBYE","CRUEL","WORLD","IM","LEAVING","U","TODAY"]

let str = `GOODBYE,CRUEL,WORLD,IM,LEAVING,U,TODAY`
let matches = [];

function recurse(str, matches) {
    let regex = /^((,?([A-Z]+))+)$/gm
    let m
    while ((m = regex.exec(str)) !== null) {
        matches.unshift(m[3])
        return str.replace(m[2], '')
    }
    return "bzzt!"
}

while ((str = recurse(str, matches)) != "bzzt!") ;
console.log("Matches: ", JSON.stringify(matches))

注意:如果您真的要使用它,您会使用正则表达式匹配函数给出的匹配位置,而不是字符串替换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接