2016-09-27 20 views
4

之间我有串:JavaScript的正则表达式得到所有的数字,但排除所有括号

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

,但它似乎是错的,看起来积极的向前看比消极看向更重要。

+0

很抱歉,但也都从结果的数字,我需要在方括号内放置。 最终结果应该是: [1234] [blabla 101112] [67890] [113141516] bla171819 [212123] –

回答

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]

这不具有]正则表达式匹配任何数量提前没有匹配[

正则表达式破碎:

\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

这种情况(不是来自问题,而是我的工作)不起作用(编号嵌套到): str5 =“1232 [dfgdfgsdf 45]”; str5.replace(/ \ b \ d + \ b(?![^] [] * \])/ g,“[$ 1]”); –

+0

啊,没错,需要做一些小调整。现在使用正则表达式演示来检查我的更新答案。 – anubhava

+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);

1

我将寻求并删除方括号分隔的子字符串,然后做一个匹配所有有限数字的字符串......类似这样的东西:

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

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

这里的区别在于'/\[.+?\]/ g'如果存在则不匹配是'['和']'之间的换行符号。这就是为什么我坚持否定字符类。 –

+0

这是真的,在这种情况下,我会用'/ \ [[\ s \ S] +?\]/g'来代替'/\[.+?\]/ g'。 – James

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

+0

它的工作原理! 此外,我修改添加[]到'裸体'号码: str4 =“1234 [blabla 101112] 67890 [113141516] bla171819 212123”; (?(\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\') 看来问题完全解决了! 但我不明白你的模式:) –

+0

@Sam Aniston该模式使用前面的'(?=)'。它看起来前面是'\ s *'(0个或更多的空格),后面跟着一个'\ ['(右方括号)或'|'作为行尾'$' - >'(?= \ s * \ [| $ $]并在全局前面收集所有小数点\ d +'。我很高兴你解决了你的问题。 – Redu

+0

这是错误的,如果输入是'1234 bla171819 [blabla 101112] 67890 [113141516] bla171819 212123' – anubhava

相关问题