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

wpcxdonn  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(119)

试图理解如何提出一个正则表达式,允许包含变体的捕获组匹配字符串中的所有变体。
字符串示例如下:
/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中使用。

5uzkadbs

5uzkadbs1#

如果你事先知道你的字符串将位于三个关键字“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

相关问题