10

我正在尝试编写一个正则表达式,它将查找大括号之间不以“my:”开头的所有值。例如,我想捕获{this}但不是{my:monkey}.

捕捉一切的模式是:

\{([^\}]*)\}

我很难让它工作。到目前为止,我最近的镜头是:

\{[^my:]*([^\}]*)\}

这会失败,因为它只忽略以“m”、“y”或“:”开头的标签。

我确定有一个命令我忽略了将“我的:”视为一个块..

(注意:必须适用于 Javascript)

4

4 回答 4

13

这个应该做:

/\{((?!my:)[^}]+)\}/g

检查快速演示http://jsbin.com/ujazul/2/edit

于 2013-07-19T22:30:28.730 回答
3

总结如下:

// test match thing_done but not some_thing_done (using nagative lookbehind)
console.log(/(?<!some_)thing_done/.test("thing_done")); // true
console.log(/(?<!some_)thing_done/.test("some_thing_done")); // false

// test match thing_done but not think_done_now (using nagative lookahead)
console.log(/thing_done(?!_now)/.test("thing_done")); // true
console.log(/thing_done(?!_now)/.test("thing_done_now")); // false

// test match some_thing_done but not some_thing (using positive lookbehind)
console.log(/(?<=some_)thing_done/.test("thing_done")); // false
console.log(/(?<=some_)thing_done/.test("some_thing_done")); // true

// test match thing_done but not think_done_now (using positive lookahead)
console.log(/thing_done(?=_now)/.test("thing_done")); // false
console.log(/thing_done(?=_now)/.test("thing_done_now")); // true

对话版:

I need match some_thing_done not thing_done:
  Put `some_` in brace: (some_)thing_done
  Then put ask mark at start: (?some_)thing_done
  Then need to match before so add (<): (?<some_)thing_done
  Then need to equal so add (<): (?<=some_)thing_done
--> (?<=some_)thing_done
    ?<=some_: conditional back equal `some_` string

链接示例代码:https ://jsbin.com/yohedoqaxu/edit?js,console

于 2019-08-02T04:20:18.497 回答
2

你可以这样做:

var input = "I want to capture {this} but not {my:monkey}";
var output = input.replace(/{(my:)?([^}]*)}/g, function($0, $1, $2) { 
    return $1 ? $0 : "[MATCH]"; 
});
// I want to capture [MATCH] but not {my:monkey}
于 2013-07-19T22:35:03.887 回答
0

{(?!my:)(.*?)}在正则表达式朋友中工作:http: //preview.tinyurl.com/nkcpoy7

于 2013-07-19T22:46:39.803 回答