如果我指定开始和结束,没有开始字符,如何使用正则表达式获取子字符串?

时间:2015-10-21 13:35:09

标签: regex

我有这样的字符串:

12abcc?p_auth=123ABC&ABC&s

符号开头是“p_auth =”,首字母结束符号“& ”符号。

P.S符号'&'并且不得包含'p_auth ='。

我写过正则表达式:

(p_auth).+?(?=&)

好的,那很好用,它得到了子字符串:

p_auth = 123ABC

bot如何在没有'p_auth'的情况下获取字符串?

2 个答案:

答案 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不匹配,但与bb中的bed(仅debt}匹配。 (?<=a)b(正向后视)与cab中的b(仅b)匹配,但与beddebt不匹配。

在大多数情况下,你并不需要环顾四周。在这种情况下,您可以使用

p_auth(.*?)&

获得第一个捕获组值。

.*?模式将查找换行符以外的任意数量的字符,但查找匹配项所需的字符数尽可能少。它被称为 lazy 点匹配,因为?符号使*量词停止在正则表达式中后续子模式匹配的第一个符号之前。

.*&将匹配所有子字符串,直到最后&,因为*量词是贪婪 - 它会消耗尽可能多的字符

请访问Repetition with Star and Plus regular-expressions.info页面了解更多信息。

答案 1 :(得分:0)

p_auth(.+?)(?=&)

只需使用此功能并抓住group 1capture 1