JavaScript正则表达式获取所有数字但排除括号之间的所有数字

时间:2016-09-27 21:03:34

标签: javascript regex brackets

我有字符串:

123 df456 555 [ 789 ] [abc 1011 def ] [ ghi 1213] [jkl mno 1415 pqr] 161718 jkl 1920

我只需要获取不在square brackets [ ]之间的数字。 我需要在square brackets [ ]内放置的所有结果数字 正确的结果应该是:

[123] df456 [555] [ 789 ] [abc 1011 def ] [ ghi 1213] [jkl mno 1415 pqr] [161718] jkl [1920]

我试过编写这样的JavaScript正则表达式: /(?!\[(.*?)\])((\s|^)(\d+?)(\s|$))/ig

但似乎是错误的,似乎积极的前瞻优先于消极的前瞻。

4 个答案:

答案 0 :(得分:2)

假设方括号是平衡的和非嵌套的,您还可以使用负前瞻来抓取[...]之外的数字:

var str = '1232 [dfgdfgsdf 45] 1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123';
var re = /\b\d+\b(?![^[]*\])/g;

var repl = str.replace(re, "[$&]");

console.log(repl);
//=> [1232] [dfgdfgsdf 45] [1234] [ blabla 101112 ] [67890] [113141516 ] bla171819 [212123]

此正则表达式匹配前面没有]的任何数字,而不匹配[

RegEx分手:

\b             # word boundary
\d+            # match 1 or more digits
\b             # word boundary
(?!            # negative lookahead start
   [^[]*       # match 0 or more of any character that is not literal "["
   \]          # match literal ]
)              # lookahead end

RegEx Demo

答案 1 :(得分:1)

匹配[]之间的所有子字符串并匹配并捕获其他全字(字边界内):

/\[[^\][]*\]|\b(\d+)\b/g

请参阅下面的regex demo和演示代码。

详细

  • \[[^\][]*\] - [,然后是[]以外的0 +字符,以及]
  • | - 或
  • \b - 领先的字边界
  • (\d+) - 第1组捕获一个或多个数字
  • \b - 尾随字边界
  • /g - 全局,预计会出现多次



var regex = /\[[^\][]*\]|\b(\d+)\b/ig;
var str = '1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123';
var res = [];
while ((m = regex.exec(str)) !== null) {
  if (m[1]) res.push(m[1]);
}
console.log(res);




答案 2 :(得分:1)

我会寻找并删除方括号分隔的子串,然后匹配所有有界的数字字符串......就像这样:

var string = '1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123';

string.replace(/\[.+?\]/g, '').match(/\b\d+\b/g);
  // => ["1234", "67890", "212123"]

答案 3 :(得分:1)

可能你可以这样做;

var str = "1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123",
 result = str.match(/\d+(?=\s*\[|$)/g);
console.log(result);

\d+(?=\s*\[|$)

Regular expression visualization

Debuggex Demo