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

JavaScript正则表达式获取所有数字,但排除括号之间的所有数字,javascript,regex,brackets,Javascript,Regex,Brackets,我有字符串: 123 df456 555[789][abc 1011 def][ghi 1213][jkl mno 1415 pqr]161718 jkl 1920 我只需要得到不放在方括号[]之间的数字。 我需要将所有生成的数字放在方括号内[] 正确的结果应该是: [123]df456[555][789][abc 1011 def][ghi 1213][jkl mno 1415 pqr][161718]jkl[1920] 我尝试过编写这样的JavaScript正则表达式: /(?!\[(.*?

我有字符串:

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

我只需要得到不放在
方括号[]
之间的数字。 我需要将所有生成的数字放在方括号内[] 正确的结果应该是:

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

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


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

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

请参阅下面的示例代码和演示代码

详情:

  • \[^\][*\]
    -
    [
    ,然后是
    [
    ]
    之外的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]);
}

控制台日志(res)我将查找并删除方括号分隔的子字符串,然后对所有有界数字字符串进行匹配。。。大概是这样的:

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

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

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

var str='1232[dfgdfgsdf45]1234[blabla 101112]67890[113141516]bla171819 212123';
变量re=/\b\d+\b(?![^[]*\])/g;
var repl=str.replace(re,“[$&]”;
console.log(repl);

//=>[1232][dfgdfgsdf 45][1234][blabla 101112][67890][113141516]bla171819[212123]
可能您可以做以下操作

var str=“1234[blabla 101112]67890[113141516]bla171819 212123”,
结果=str.match(/\d+(?=\s*\[\$)/g);

console.log(result);
这里的区别是,如果在
[
]
之间有换行符,则
/\[.+?\]/g
将不匹配。这就是为什么我坚持使用否定字符类的原因。这是正确的,在这种情况下,我将用
/\[\s]+?\]替换
/\[/g
。对不起,还有我需要放在方括号内的结果中的所有数字。最终结果应该是:[1234][blabla 101112][67890][113141516]bla171819[212123]它可以工作!我还修改为将[]添加到“裸”数字中:str4=“1234[Blablabla 101112]67890[113141516]bla171819 2123”;str4.replace(/((\d+)(=\s*[|$)/g,”[1]”;问题似乎完全解决了!但我不理解你的模式:)@Sam Aniston该模式使用了一个向前看的
(?=)
。它向前看一个
\s*
(0个或更多的空格),后跟一个
\[
(右方括号)或
作为行尾
$
->
(?=\s*\[\124$)
并在全局范围内收集所有小数
\d+
。我很高兴你解决了你的问题。这是错误的,如果输入是
1234 bla171819[blablabla 101112]67890[113141516]bla171819 212123
@anubhava,给定的字符串模式就是这里的基础。如果你在
上应用它,它也会中断。请告诉我[查看1234]如果字符串中的这些数字后面没有空格和方括号,并且这些数字不在字符串的末尾,则6543break“
字符串。
\d+(?=\s*\[\124;$)
将不起作用。这种情况(不是出于疑问,但在我的工作中)不起作用(数字嵌套到)):str5=“1232[dfgdfgsdf45]”str5.replace(/\b\d+\b(?![^][]*])/g,“[$1]”;啊,没错,需要一个小调整。现在用正则表达式演示检查我的更新答案。
var string = '1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123';

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