regex 正则表达式,捕获捕获组的变量0次或更多次

zvms9eto  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(168)

试图理解如何提出一个正则表达式,允许包含变量的捕获组匹配字符串中的所有变量。
字符串示例如下:
/sometexthere/moretexthere?type=1234&data=56357782&noextract=6532
目标是使用类似于以下的模式返回123456357782,但不返回6532,这是我能够得到的程度:
/sometexthere/moretexthere\?(?:&?(?:type|data|reason)=([0-9a-z:.%\-]+)*)+
另一个示例字符串是
/sometexthere/moretexthere?data=56357782&noextract=6532&type=1234
将返回563577821234,但不返回6532
还有一个例子
/sometexthere/moretexthere?reason=1234
返回1234
目标是返回(type|data|reason)变量的一部分值,因此只要字符串中有类型、数据或原因(无论它们的顺序如何),它就会返回它们前面的值,而不仅仅是找到的第一个/最后一个匹配。
不幸的是,我能想到的最好的正则表达式,上面的例子,只返回字符串的最后一个匹配,而不包括之前的任何其他匹配。
不知道它是否有任何相关性,但这意味着要在Android Java/Kotlin中使用。

cetgtptt

cetgtptt1#

如果你事先知道你的字符串将位于三个关键字“type”,“data”或“reason”之一之后,你可以直接使用它们与lookarounds来捕捉你所需要的数字。

(?<=(?:/sometexthere/moretexthere\?|&)\b(?:type|data|reason)\b=)([0-9a-z:.%\-]+)

Regex解释:

  • (?<=(?:/sometexthere/moretexthere\?|&)\b(?:type|data|reason)\b=):查找
  • (?:/sometexthere/moretexthere\?|&):非捕获组,包含您的路径或“&”
  • \b:字边界
  • (?:type|data|reason):三个字之一的非捕获组
  • \b:字边界
  • =:“等于”符号
  • ([0-9a-z:.%\-]+):您的比赛

检查演示here

相关问题