是否可以仅使用环视来匹配前后不重复的字符?
Is it possible to use only lookaround to match characters that are not repeated immediately before and after?
例如匹配URL.
中域名后的第一个斜杠
意图:只匹配 '.com/...'
中的 '/'
但不匹配 'https://'
.
中的任何 '/'
url = 'https://example.com/...';
[
url.match( /(?<!\/)(?<slash>\/)(?!\k<slash>).../), // [A]
url.match(/(?<!\k<slash>)(?<slash>\/)(?!\k<slash>).../) // [B]
]
上面的[A]returns是正确的匹配,但是[B]是我想要的种类 (虽然它没有匹配任何字符),也就是说,在正则表达式正文中只使用/
字符1次。
是否有广义表达式形式类似于[B](使用捕获组等)并且只使用正则表达式文字(而不是使用构造函数(RegExp
))?
如果您所有的输入都是 URL,这将执行您想要的操作:
/\/\/.+?(\/)/
然后捕获第一组:
url = 'https://example.com/...';
const matches = url.match(/\/\/.+?(\/)/);
console.log(matches[1]);
您可以在否定前瞻中的可选字符之后放置肯定回顾。 lookbehind 断言 2 个连续的斜杠(使用引用)。这样,lookbehind 测试捕获的斜杠位置以及之前的位置。显然,当它成功时,否定前瞻失败。
/(\/)(?!.?(?<={2}))/
(随意使用命名捕获)
或没有捕获:
/\/(?!.?(?<=\/\/))/
例如匹配URL.
中域名后的第一个斜杠
意图:只匹配 '.com/...'
中的 '/'
但不匹配 'https://'
.
'/'
url = 'https://example.com/...';
[
url.match( /(?<!\/)(?<slash>\/)(?!\k<slash>).../), // [A]
url.match(/(?<!\k<slash>)(?<slash>\/)(?!\k<slash>).../) // [B]
]
上面的[A]returns是正确的匹配,但是[B]是我想要的种类 (虽然它没有匹配任何字符),也就是说,在正则表达式正文中只使用/
字符1次。
是否有广义表达式形式类似于[B](使用捕获组等)并且只使用正则表达式文字(而不是使用构造函数(RegExp
))?
如果您所有的输入都是 URL,这将执行您想要的操作:
/\/\/.+?(\/)/
然后捕获第一组:
url = 'https://example.com/...';
const matches = url.match(/\/\/.+?(\/)/);
console.log(matches[1]);
您可以在否定前瞻中的可选字符之后放置肯定回顾。 lookbehind 断言 2 个连续的斜杠(使用引用)。这样,lookbehind 测试捕获的斜杠位置以及之前的位置。显然,当它成功时,否定前瞻失败。
/(\/)(?!.?(?<={2}))/
(随意使用命名捕获)
或没有捕获:
/\/(?!.?(?<=\/\/))/