PCRE2 - 匹配后缀匹配反向引用的每个单词

问题描述

给定下面的字符串,

const attachmentData = [{name: 'Suman Baidh',attachment: ["123","456"]},{name: 'John Sigma',attachment: ["789","101112"]},{name: 'Binay',attachment: ["131415","161718","192021"]}]
const attachmentDetail = [{"id":"123",details:{"cost":10,"quantity":20}},{"id":"456",details: {"cost":15,"quantity":28}},{"id":"789",details:{"cost":4,"quantity":9}},{"id":"101112",details:{"cost":40,"quantity":2}},{"id":"131415",details:{"cost":12,{"id":"161718",details:{"cost":45,{"id":"192021",details:{"cost":120,"quantity":1}}];
  
  function customMerge(data,attachments) {
  
    const hashById = attachments.reduce((acc,ele) => {
      acc[ele.id] = ele;
      return acc;
    },{});

    return data.reduce((acc,{attachment,name}) => {
            return acc.concat(attachment.map(id => ({name,id,details: hashById[id].details})));
    },[]);
  }
  
  console.log(customMerge(attachmentData,attachmentDetail))

目标是匹配每个单词,使得后缀是一个ay bee ceefooh deefoo38 ee 37 ef gee38 aitch 38 eye19 jay38 kay 99 el88 em38 en 29 ou38 38 pee 12 q38 arr 999 esss 555 之后出现的数字相匹配的数字(在本例中恰好是 38)。

只有一个foo 开头并以数字结尾的子字符串。预期的匹配都存在于所述子字符串之后。

预期匹配:

foo

我已经尝试过 gee38 jay38 em38 ou38 q38 foo(\d+).*?(\w+\1)\b,但它们无法全部匹配,因为它们匹配第一个 (foo(\d+).*(\w+\1)\b) 或最后一个 (gee38 ).

是否有可能只用一个正则表达式就可以匹配所有内容,重要的是,只需一次运行?

我使用的 PCRE2 引擎的行为方式与 https://regex101.com/r/uFEDOE/1 相同。因此,如果正则表达式可以匹配 regex101 上的多个子字符串,那么我使用的引擎也可以。

解决方法

(?:foo|\G(?!^))(\d+).*?(?=(\w+))\w+(?=\1\b)

Demo

可能是一些大小或性能优化。

@Niko Gambt,请说是否有任何优化对您很重要。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...