我有这样的字符串:
12abcc?p_auth=123ABC&ABC&s
符号开头是“p_auth =”,首字母结束符号“& ”符号。
P.S符号'&'并且不得包含'p_auth ='。
我写过正则表达式:
(p_auth).+?(?=&)
好的,那很好用,它得到了子字符串:
p_auth = 123ABC
bot如何在没有'p_auth'的情况下获取字符串?
答案 0 :(得分:2)
使用look-arounds:
(?<=p_auth=).*?(?=&)
请参阅regex demo
后视(?<=p_auth=)
和前瞻(?=&)
不会消耗字符,因为它们是零宽度断言。他们只是在某个子模式之前或之后检查子串存在。
关于(?<=p_auth=)
的更多话语。这是一个积极的后视。正面是因为它需要在其中的图案出现在左侧,在“主”子图案之前。如果找到了look-behind子模式,结果只是“true”,正则表达式继续检查其余的子模式。如果没有,则匹配失败,引擎继续寻找下一个索引的另一个匹配。
以下是regular-expressions.info的一些说明:
它[后视]告诉正则表达式引擎暂时在字符串中向后退,以检查lookbehind内的文本是否可以在那里匹配。
(?<!a)b
匹配"b"
之前没有"a"
的{{1}},使用负面后瞻。它与cab不匹配,但与b
或b
中的bed
(仅debt
}匹配。(?<=a)b
(正向后视)与cab中的b
(仅b
)匹配,但与bed
或debt
不匹配。
在大多数情况下,你并不需要环顾四周。在这种情况下,您可以使用
p_auth(.*?)&
获得第一个捕获组值。
.*?
模式将查找换行符以外的任意数量的字符,但查找匹配项所需的字符数尽可能少。它被称为 lazy 点匹配,因为?
符号使*
量词停止在正则表达式中后续子模式匹配的第一个符号之前。
.*&
将匹配所有子字符串,直到最后&
,因为*
量词是贪婪 - 它会消耗尽可能多的字符
请访问Repetition with Star and Plus regular-expressions.info页面了解更多信息。
答案 1 :(得分:0)
p_auth(.+?)(?=&)
只需使用此功能并抓住group 1
或capture 1
。