Javascript 正则表达式匹配前不带“quot;]&引用;

Javascript 正则表达式匹配前不带“quot;]&引用;,javascript,regex,Javascript,Regex,我有一段文本,其中普通标记和自定义标记扩展混合在一起。这很有效 [My Link Title](http://example.com) (extension: value attribute: value) 但是,我有一个问题:要在编辑文本时应用一些样式,我需要一种方法来匹配扩展代码段的左括号,而不匹配标记链接的左括号 换句话说:我需要一个正则表达式(在javascript中工作)来匹配一个开始的括号(并且只有括号) 由[a-z0-9]+:和 前面没有]字符 我当前的正则表达式(它很好地匹配

我有一段文本,其中普通标记和自定义标记扩展混合在一起。这很有效

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

(extension: value attribute: value)
但是,我有一个问题:要在编辑文本时应用一些样式,我需要一种方法来匹配扩展代码段的左括号,而不匹配标记链接的左括号

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

  • [a-z0-9]+:
  • 前面没有
    ]
    字符
  • 我当前的正则表达式(它很好地匹配扩展标记的开始括号,但不幸的是也包括标记链接的开始括号)如下所示:
    /\((?=[a-z0-9]+:)/i

    我见过有人在正则表达式的开头使用带否定的正lookaheads,比如说
    /(?=[^\]])\((?=[a-z0-9]+:)/I
    来检查PHP中的。不幸的是,这在javascript中似乎不起作用


    更新

    谢谢你的提示

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

    毕竟,我采用了另一种解决方案。我只创建了两个正则表达式:

  • 将所有开头的扩展括号与“]”以外的前一个字符匹配:
    /[^\]\(?=[a-z0-9]+:)/i
  • 匹配所有不带任何前置字符的开头扩展括号:
    /^\((?=[a-z0-9]+:)/i
  • 尽管这不是最干净的方式,但目前它似乎运行得很好。

    使用:

    • \[^\]+\]\([^\]]+\)
      -匹配
      []()
      链接(如果这太令人困惑,您也可以编写
      \[.*.\]\(.*.\)
      ),或者-
    • (\(\b)
      -匹配并捕获字母数字字符前面的一个开括号
    工作示例:


    您必须查看结果并仅处理捕获到的
    $1
    分组的匹配项,而忽略其他匹配项。

    您要求的是JS中不可用的反向查找。此外,当您同时需要向前看和向后看(如字符串反转)时,没有已知的解决方法。您需要匹配的不仅仅是一个括号并使用捕获组。类似于
    /(^ |[^\])\(?=[a-z0-9]+)/i
    @stribizhev-这通常是正确的,但在这种情况下,您可能可以反转字符串并使用
    \b\(?!\)
    ,这很简单。@Kobi:True,唯一的
    ]
    是一个非单词字符。太好了!因此,如果“向前看”和“向后看”的宽度可变,就没有解决方案了。@Kobi感谢您的提示!请查看我现在使用的解决方案的更新问题。很好的解决方案!我唯一的问题是我正在创建一个“简单模式"用于突出显示的CodeMirror的语法模式。这允许您指定将应用于匹配字符的正则表达式和标记,并且不允许对匹配进行任何进一步的操作。但是,您可以编写一个完整的语法模式,在该模式下您可以执行此类操作,但我无法:-s@DieserJonas-哦,真遗憾!你说了“匹配一个开始的括号(并且只匹配括号)”。你可能很难使用JavaScript正则表达式引擎,它非常弱…谢谢!@DieserJonas-另外,我不知道CodeMirror,但是在你查找
    之前,你能在一个语法规则中匹配
    […](…)
    ?通常这些工具都有优先级。我只是用我现在使用的解决方案编辑了我的原始问题。问题是这种“简单模式”基本上是一个状态机,可以在状态之间切换,并基于正则表达式应用令牌类型。这有点有限。如果我能够编写完整的语法模式,我想我将能够很好地使用您的解决方案。不幸的是,这比我当前的技能水平有点高。我可能会在将来某个时候重新讨论这个问题然后根据你的答案做出更好的解决方案。
    \[[^\]]+\]\([^\)]+\)|(\(\b)