首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/(?<=.*)(\w\w)(?=.*)/没有给出我期望的

/(?<=.*)(\w\w)(?=.*)/没有给出我期望的
EN

Stack Overflow用户
提问于 2021-08-01 23:02:23
回答 2查看 44关注 0票数 1

我正在浏览器的控制台中尝试下面的regex /(?<=.*)(\w\w)(?=.*)/

我读了这个正则表达式如下:“查找和捕获任何两个字母数字字符之前和后面的零或更多的任何字符出现”。

与“ab de”作为输入,我希望我的浏览器匹配"ab","bc","cd“和"de”。

为什么它只给我"ab“和"cd"?

有没有办法让正则表达式返回我想要的所有匹配("ab“、"bc”、"cd“和"de")?

我知道围城是用来做什么的,我已经看过How does the regular expression ‘(?<=#)[^#]+(?=#)’ work?了。从2018-2019开始,谷歌Chrome就支持Lookbehind。

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-01 23:29:03

  1. /(?<=.*)(\w\w)(?=.*)//(\w\w)/是一样的,因为“在任何情况下”都是匹配的(因为它匹配空字符串)。
  2. non-zero-length,零长度断言(\b$(?=)等)不同,所有其他表达式都是,即它们从字符串中消耗一口长度。有一些搜索游标按照这个长度进行,并且从不后退。如果找到2个符号,则此游标由2个符号进行,搜索继续进行。

对于描述的行为,您需要手动移动此游标,如下所示:

代码语言:javascript
复制
const str = 'abcde';

const re = /(\w\w)/g;

let result;

while (result = re.exec(str)) {
  console.log(result);
  re.lastIndex--;
}

票数 2
EN

Stack Overflow用户

发布于 2021-08-01 23:48:02

因此,为了找到重叠的匹配,您必须将所需的模式放在一个展望中。

代码语言:javascript
复制
(?=(\w\w))

Regex演示

示例:

代码语言:javascript
复制
const regex = /(?=(\w\w))/gm;
const str = `abcde`;
let m;
let matches = [];

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        if (groupIndex === 1) {
         matches.push(match);
        }
    });
}
console.log(matches);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68614987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档