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

JavaScript regex get all numbers but exclude all between 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

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

匹配[]之间的所有子字符串,匹配并捕获其他完整的单词(在单词边界内):

/\[[^\][]*\]|\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);

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

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

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

假设方括号是平衡的且未嵌套的,您还可以使用否定前瞻来获取 [...]:

之外的数字

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]

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

正则表达式分解:

\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

也许你可以这样做;

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

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

Debuggex Demo