在第n个字符之前和之后匹配组

时间:2019-07-14 13:01:33

标签: javascript regex

我要匹配第n个字符之前的所有字符(第一个字符除外)及其后的所有字符。所以对于以下字符串

/firstname/lastname/some/cool/name

我想比赛

Group 1: firstname/lastname
Group 2: some/cool/name

使用以下正则表达式,我快到了,但是我找不到正确的正则表达式来正确匹配第一个组,而忽略了第一个/:

([^\/]*\/){3}([^.]*)

请注意,我一直想匹配第三个正斜杠。之后的所有内容都可以是URL中有效的任何字符。

3 个答案:

答案 0 :(得分:1)

您的正则表达式组未给出正确的结果,因为([^\/]*\/){3}您正在重复捕获的组,它将覆盖先前匹配的组Read this

您可以使用

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

enter image description here

let str = `/firstname/lastname/some/cool/name`

let op = str.match(/^.([^/]+\/[^/]+)\/(.*)$/)

console.log(op)

答案 1 :(得分:1)

量词{3}重复捕获组的3倍,这将具有最后一次迭代的值。

第一次迭代将匹配/,第二次firstname/和第三次(最后一次迭代)lastname/将成为组的值。

第二组捕获匹配的[^.]*,它将匹配0+而不是不考虑数据结构的文字点。

如果要匹配完整模式,可以使用:

^\/([^\/]+\/[^\/]+)\/([^\/]+(?:\/[^\/]+)+)$

说明

  • ^字符串的开头
  • (捕获组1
  • )关闭群组
  • \/匹配/
  • (捕获组2
    • [^\/]+匹配1次以上而不是/
    • (?:\/[^\/]+)+重复匹配/的1次以上和不重复/的1次以上,以匹配其余字符串的模式。
  • )关闭群组
  • $字符串结尾

Regex demo

答案 2 :(得分:0)

忽略第一个/,然后捕获前两个单词,然后捕获/之后的其余短语。

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

See example