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
也许你可以这样做;
var str = "1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123",
result = str.match(/\d+(?=\s*\[|$)/g);
console.log(result);
\d+(?=\s*\[|$)
我有字符串:
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
也许你可以这样做;
var str = "1234 [ blabla 101112 ] 67890 [113141516 ] bla171819 212123",
result = str.match(/\d+(?=\s*\[|$)/g);
console.log(result);
\d+(?=\s*\[|$)