代码之家  ›  专栏  ›  技术社区  ›  Code Guy

使用regex js匹配最后一个最佳单词

  •  -1
  • Code Guy  · 技术社区  · 4 年前

    我有一个正则表达式来匹配括号内的文本。例如正则表达式 https://regex101.com/r/TvweUj/3

    /\b(\w)[-'\w]* (?:[-",/\\*&'\w]* ){1,}\(\1[A-Z]{1,}\)/gi
    

    比赛 MIDI用于MIDI设备的USB设备类定义传输乐器数字接口(MIDI)。 而不是只匹配最后4个单词

    如何更改regex以匹配最近的匹配,而不是从 MIDI USB设备 *****

    0 回复  |  直到 4 年前
        1
  •  1
  •   The fourth bird    4 年前

    您可以使用4个具有正向前瞻断言4个反向引用的捕获组来匹配括号之间的大写字符:

    \b([A-Z])\w+ ([A-Z])\w+ ([A-Z])\w+ ([A-Z])\w+(?= \(\1\2\3\4\))
    

    Regex demo

    而不是使用 \w 只是,你可以使用你在问题中使用的字符类,比如 [-",/\\*&'\w]*


    更广泛的模式可以是重复一个大写字符,后跟1+个单词字符 \w+ (或使用) \w* 重复0+字字符)并断言后面的内容只有括号之间的大写字符。

    \b[A-Z]\w+(?: [A-Z]\w+)*(?= \([A-Z]+\))
    

    Regex demo


    如果要在括号之间匹配的字符数是可变的,并且它们应该与之前的字数匹配,则可以使用2个捕获组,并将拆分的字数与括号之间的大写字符数进行比较。

    let pattern = /\b([A-Z][a-z]*(?: [A-Z][a-z]*)*) \(([A-Z]+)\)/;
    let compare = (ar1, ar2) =>
      ar1.length === ar2.length && ar1.every(
        (value, index) => value === ar2[index].charAt(0)
      );
    [
      "transmits Music Instrument Digital Interface (MIDI).",
      "transmits Music Instrument Digital Interface (MADI).",
      "transmits Music Instrument Digital Interface (MID)."
    ].forEach(s => {
      let m = s.match(pattern);
      let res = compare(m[2].split(''), m[1].split(' ')) ? "Ok -> " : "Not ok -> ";
      console.log(res + s);
    })