正则表达式以匹配URL行尾或“ /”字符


79

我有一个URL,我正在尝试将其与一个正则表达式匹配以提取一些组。我遇到的问题是URL可以以“ /”和更多URL文本结尾继续。我想匹配以下网址:

但不匹配这样的东西:

所以,我认为我最好的选择是这样的:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]

末尾的字符类包含“ /”或行尾。字符类似乎对其中的“ $”不满意。我如何最好地区分这些URL,同时仍然撤回正确的组?

Answers:


41
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$

第一捕获小组 (.+)

.+ 匹配任何字符(行终止符除外)

  • + 量词-匹配一次无限次,尽可能多地匹配,并根据需要返回(贪婪)

第二捕获小组 (\d{4}-\d{2}-\d{2})

\d{4}匹配一个数字(等于[0-9]

  • {4} 量词-精确匹配4

--从字面上匹配字符(区分大小写)

\d{2}匹配一个数字(等于[0-9]

  • {2} 量词-精确匹配2

--从字面上匹配字符(区分大小写)

\d{2}匹配一个数字(等于[0-9]

  • {2} 量词-精确匹配2

--从字面上匹配字符(区分大小写)

第三捕获小组 (\d+)

\d+匹配一个数字(等于[0-9]

  • + 量词-匹配一次无限次,尽可能多地匹配,并根据需要返回(贪婪)

第四捕获小组 (.*)?

? 量词-之间的匹配一个需要时间,多次地,用之于(贪婪)

.*匹配任何字符(行终止符除外)

  • * 量词-在次和无限制次数之间进行匹配,并尽可能多地匹配,并根据需要返回(贪婪)

$ 断言字符串末尾的位置


125

要匹配/或内容结尾,请使用 (/|\z)

仅当您不使用多行匹配时(即,您正在匹配单个URL,而不是用换行符分隔的URL列表),这才适用。


将其与您所拥有内容的更新版本放在一起:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)

请注意,我已将开始更改为非空白(\S+?)的非贪婪匹配,而不是所有内容(.*)的匹配


6
我如何给您更多点;)谢谢。仅对文档(/ | \ A)将匹配正斜杠或字符串的开头。
塞尼卡·冈萨雷斯

恭喜您获得了新的Gold Answer徽章;)-刚意识到我已将您推高到100!
random_user_name

\ z的内容似乎无法在javascript中工作:/
Max Waterman

61

现在,您有几个正则表达式可以满足您的需要,因此已经足够了。

一直没有什么提的是,为什么你的图谋是不会工作:在字符类,$(以及^./)没有特殊的意义,所以[/$]比赛无论是文字/或文字$,而不是终止正则表达式(/)或匹配行尾($)。


8
这是经常被遗忘的东西,在正则表达式文档中没有充分提及。
史蒂夫·邓恩

5
请注意,^在字符类中可能具有特殊含义。如果它是该类中的第一个字符,则它将成为否定类,它将匹配除其他字符以外的任何字符。例如,要匹配a或b以外的任何内容,可以使用[^ ab]。要包含文字^,只需确保它不是第一个,所以要匹配a,b或^,您将使用[ab ^]。
David Mason

18

在Ruby和Bash中,可以$在圆括号内使用。

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)

(此解决方案类似于Pete Boughton的解决方案,但保留了的使用$,它表示行尾,而不是使用\z,它表示行尾。)


2
我也知道PHP。我认为没有任何理由$不能在括号()中实际使用任何实现。是括号[]使它字面意思。
乔尔·梅隆

3
$可以在javascript中以这种方式工作,而\z不能(Chrome 48,Firefox 43,IE9)。
Vsevolod Golovanov

1
这是最简单的选择。匹配斜线或行尾。它甚至与此问题的标题匹配!
Brett Donald
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.