试图理解如何提出一个正则表达式,允许包含变量的捕获组匹配字符串中的所有变量。
字符串示例如下:/sometexthere/moretexthere?type=1234&data=56357782&noextract=6532
目标是使用类似于以下的模式返回1234
和56357782
,但不返回6532
,这是我能够得到的程度:/sometexthere/moretexthere\?(?:&?(?:type|data|reason)=([0-9a-z:.%\-]+)*)+
另一个示例字符串是/sometexthere/moretexthere?data=56357782&noextract=6532&type=1234
将返回56357782
和1234
,但不返回6532
还有一个例子/sometexthere/moretexthere?reason=1234
返回1234
目标是返回(type|data|reason)
变量的一部分值,因此只要字符串中有类型、数据或原因(无论它们的顺序如何),它就会返回它们前面的值,而不仅仅是找到的第一个/最后一个匹配。
不幸的是,我能想到的最好的正则表达式,上面的例子,只返回字符串的最后一个匹配,而不包括之前的任何其他匹配。
不知道它是否有任何相关性,但这意味着要在Android Java/Kotlin中使用。
1条答案
按热度按时间cetgtptt1#
如果你事先知道你的字符串将位于三个关键字“type”,“data”或“reason”之一之后,你可以直接使用它们与lookarounds来捕捉你所需要的数字。
Regex解释:
(?<=(?:/sometexthere/moretexthere\?|&)\b(?:type|data|reason)\b=)
:查找(?:/sometexthere/moretexthere\?|&)
:非捕获组,包含您的路径或“&”\b
:字边界(?:type|data|reason)
:三个字之一的非捕获组\b
:字边界=
:“等于”符号([0-9a-z:.%\-]+)
:您的比赛检查演示here。