与正则表达式匹配“问号”混淆

时间:2016-04-20 05:21:57

标签: regex regex-greedy

我的网址很少,如下所示:

 //Place all params in an array
 var params = [x,y,z];

 //Instantiate random number generator
 var r = new Random();

 //use 0 for min and 2 for max in this example and return 
 //the random array position
 return params[r.Next(int min, int max)];

我想检索“最后一个斜杠和问号(如果存在)之间的字符串”,即,对于上面的例子,我想检索“example”。为此,我使用了下面的正则表达式,但它不起作用。有人可以解释一下为什么它不起作用。我查了“https://regex101.com/”作为解释,但他们的解释似乎与我的想法相符,但这不是它的工作方式。匹配问号时存在一些问题,“\?*”无法匹配一个或多个问号。

join -t "," <(dos2unix <QualifiedEmployeees.csv) <(dos2unix <AllEmpployees.txt)

仅供参考,我可以在正则表达式之后写下我的用例:

www.xyz.com/search/example?x=123
www.xyz.com/search/example

我怀疑下面的正则表达式不起作用的原因:

.*\/(.*?)\?*.*

2 个答案:

答案 0 :(得分:1)

使用正向前瞻性正则表达式。

\/([^\/?]*)(?=[^\/]*$)

DEMO

(?<=\/)[^\/?]*(?=[^\/]*$)

.*\/(.*?)(?:\?|$)

您的上一个正则表达式无效,因为\?*匹配零个或多个?。如果存在,则使正则表达式匹配?或使其匹配,直到行结束。 (?:\?|$)期望匹配旁边有?或行结尾。

答案 1 :(得分:1)

您可以使用此正则表达式:

.*\/([^\?]+)

匹配“字符串中所有非问号字符的最小长度为1”。重要的是要转义?\?),因为它是0 or 1的保留字符。请注意,这预计在最后/之后至少有一个字符(i.e. www.xyz.com/search/example/?会导致example/)。如果应该避免这种情况,请将+替换为*匹配不包含?的全长字符串:

.*\/([^\?]*)

关于您的问题,为什么.*\/(.*?)\?*.*不起作用。 (.*?)部分匹配任意长度(包括0长度)的任何字符(.)的所有字符串,其中包含或不存在(?),因此基本上它与空字符串匹配。尾部\?*.*匹配所有可能或不以任意数量的?开头的字符串,因此它基本匹配所有字符串,相当于.*