javascript - Javascript中的Lookbehind:如果之前有多个字符,则不匹配
问题描述
见https://regex101.com/r/463Qpm/1/
在这种情况下,我想匹配 Bb 和 Dd
Aa : Bb, Cc : Dd
但在这种情况下,当有 { 和几个字符时
{Aa : Bb, Cc : Dd
我试过这个正则表达式,但我有错误 + 我找不到正确的语法:
(?<!{[A-Za-z]+)(?<=:\s)[A-Za-z][a-z]*
解决方案
在支持后向测试的情况下,您尝试的模式(?<!{[A-Za-z]+)(?<=:\s)[A-Za-z][a-z]*
在这两种情况下都匹配,因为两个断言在Bb
和之前的位置都为真Dd
。
有:\s
直接在左边,没有{[A-Za-z]+
直接在左边,因为不可能同时拥有两者,因此断言是正确的。
请注意查看此页面以支持 Javascript 中的lookbehind。
一个不使用环视的选项可能是使用带有交替的捕获组,首先排除您不想要的。然后在一个组中捕获您想要保留的内容。
{[A-Za-z].*|:\s([A-Za-z][a-z]*)
模式匹配
{[A-Za-z].*
Match{
,一个字符 A-Za-z 和该行的其余部分|
或者:\s
匹配:
和一个空格字符([A-Za-z][a-z]*)
捕获组 1,匹配一个字符 A-Za-z,后跟可选字符 az
const regex = /{[A-Za-z].*|:\s([A-Za-z][a-z]*)/g;
[
'Aa : Bb, Cc : Dd',
'{Aa : Bb, Cc : Dd'
].forEach(str => {
const result = Array.from(str.matchAll(regex), m => m[1]);
if (result[0] !== undefined) {
console.log(result);
}
})
使用单个lookbehind的另一个选项可能是断言{
从字符串开头的左侧没有,然后断言:\s
(?<=^[^{]*:\s)[A-Za-z][a-z]*
const regex = /(?<=^[^{]*:\s)[A-Za-z][a-z]*/g;
[
'Aa : Bb, Cc : Dd',
'{Aa : Bb, Cc : Dd'
].forEach(str => {
const result = str.match(regex);
if (result) {
console.log(result)
}
})
推荐阅读
- database - YugaByte 是否计划成为 PostgreSQL 12+ 的一种可插拔存储?
- android-studio - RecycleView 适配器和主代码因未知错误而无法正常工作,您能发现差异吗
- mql4 - 我如何判断前一根蜡烛关闭时是否在其上绘制了箭头对象?
- slack - Slack Link 展开动态域
- flutter - 如何在 Flutter 中配置的页面中继续动画?
- java - 特定的 RepaintManager 可以用于特定的 JPanel 吗?
- c# - 从 VS 创建的 .exe 文件上的文件或目录已损坏且无法读取
- node.js - 如果我们删除 www 前缀,Node/Express 中的 CORS 问题
- javascript - 推送通知错误“缺少注册”firebase 功能
- angular - 使用 Angular Universal 的选择性 SSR(服务器端渲染)