正则表达式匹配开头括号前面没有"]"

时间:2015-04-29 08:21:11

标签: javascript regex

我有一些文字,其中正常的降价和自定义降价扩展混合在一起。这很有效。

[My Link Title](http://example.com)

(extension: value attribute: value)

但是,我有一个问题:在编辑文本时应用一些样式,我需要一种方法来匹配扩展片段的左括号而不匹配降价链接的左括号。

换句话说:我需要一个正则表达式(在javascript中工作)来匹配一个左括号(只有括号)

  1. [a-z0-9]+:
  2. 进行
  3. 前面没有]字符。
  4. 我当前的正则表达式(可以很好地匹配扩展标记打开括号但不幸的是还包括降价链接开头括号)如下所示:/\((?=[a-z0-9]+:)/i

    我看到人们在正则表达式的开头使用正面前瞻和否定,如/(?=[^\]])\((?=[a-z0-9]+:)/i来检查PHP中的 。不幸的是,这似乎不适用于javascript。

    更新

    感谢您的提示!

    我遇到的问题是我正在为CodeMirror创建"简单模式" 语法模式以应用突出显示。这允许您指定将应用于匹配字符的正则表达式和标记,但不允许对匹配进行任何进一步操作。但是,您可以编写一个完整的语法模式,您可以在其中执行此类操作,但我无法做到这一点:-s

    毕竟,我选择了其他解决方案。我刚创建了两个正则表达式:

    1. 将所有打开的扩展括号与前一个字符匹配,然后是"]":
      /[^\]]\((?=[a-z0-9]+:)/i
    2. 匹配所有打开的扩展括号,没有任何前面的字符:
      /^\((?=[a-z0-9]+:)/i
    3. 即使它现在不是最干净的方式,但它现在看起来效果还不错。

1 个答案:

答案 0 :(得分:3)

使用skip and match trick

\[[^\]]+\]\([^\)]+\)|(\(\b)
  • \[[^\]]+\]\([^\)]+\) - 匹配[]()个链接(如果这太令人困惑,您也可以写\[.*?\]\(.*?\)),或者 -
  • (\(\b) - 匹配并捕获一个直接在字母数字字符之前的空括号。

工作示例:https://regex101.com/r/tY9sS4/1

您必须看到结果和流程仅匹配捕获$1分组的匹配项,并忽略其他匹配项。