我要匹配第n个字符之前的所有字符(第一个字符除外)及其后的所有字符。所以对于以下字符串
/firstname/lastname/some/cool/name
我想比赛
Group 1: firstname/lastname
Group 2: some/cool/name
使用以下正则表达式,我快到了,但是我找不到正确的正则表达式来正确匹配第一个组,而忽略了第一个/:
([^\/]*\/){3}([^.]*)
请注意,我一直想匹配第三个正斜杠。之后的所有内容都可以是URL中有效的任何字符。
答案 0 :(得分:1)
您的正则表达式组未给出正确的结果,因为([^\/]*\/){3}
您正在重复捕获的组,它将覆盖先前匹配的组Read this
您可以使用
^.([^/]+\/[^/]+)\/(.*)$
let str = `/firstname/lastname/some/cool/name`
let op = str.match(/^.([^/]+\/[^/]+)\/(.*)$/)
console.log(op)
答案 1 :(得分:1)
量词{3}
重复捕获组的3倍,这将具有最后一次迭代的值。
第一次迭代将匹配/
,第二次firstname/
和第三次(最后一次迭代)lastname/
将成为组的值。
第二组捕获匹配的[^.]*
,它将匹配0+而不是不考虑数据结构的文字点。
如果要匹配完整模式,可以使用:
^\/([^\/]+\/[^\/]+)\/([^\/]+(?:\/[^\/]+)+)$
说明
^
字符串的开头(
捕获组1
[^\/]+/[^\/]+
进行2次匹配,而不是先使用negated character class然后使用/
/
)
关闭群组\/
匹配/
(
捕获组2
[^\/]+
匹配1次以上而不是/
(?:\/[^\/]+)+
重复匹配/
的1次以上和不重复/
的1次以上,以匹配其余字符串的模式。)
关闭群组$
字符串结尾答案 2 :(得分:0)