【问题标题】:Matching the last best word using regex js使用正则表达式 js 匹配最后一个最佳单词
【发布时间】:2020-08-03 06:07:02
【问题描述】:

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

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

匹配 MIDI MIDI 设备的 USB 设备类定义传输乐器数字接口 (MIDI)。 而不是仅匹配最后 4 个字乐器数字接口

如何更改我的正则表达式以匹配最近的匹配,而不是来自 MIDI The USB Dev*****

【问题讨论】:

    标签: javascript regex string


    【解决方案1】:

    您可以使用 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);
    })

    【讨论】:

    • 第一个只有在里面有4个字符时才有效(....)对吗?
    • @rootkonda 没错,4个字符要和组里抓的一样。
    • 好的。我一直在寻找一种方法来概括()内的任何字符长度。除非我们将其与一些代码结合起来,否则仅使用正则表达式可能是不可行的?
    • @Sven.hig 如果像\b[A-Z]\w+ [A-Z]\w+(?= \([A-Z]+\)) 这样删除非捕获组,您将只匹配Digital Interface。如果将非捕获组转换为捕获组\b[A-Z]\w+( [A-Z]\w+)*(?= \([A-Z]+\)),您将捕获最后一次迭代的值Interface。它会起作用,但您根本不需要捕获组来进行完整匹配。
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2020-03-04
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多