2017-04-13 90 views
3

我具有低于匹配模式不是,()

str = "nums#1#2#3{#4}#5" 

其有一种方法可以符合所有#\d+图案排除卷曲内的那些这个字符串模式括号。

我目前正在通过在匹配前用空字符串替换大括号和所有内容来实现所需的结果。

str = str.replace(/\{[^}]*\}/g, ''); 
match = str.match(/#\d+/g); 

它有没有办法做到这一点在JavaScript正则表达式没有第一个替代?

回答

2

假设{}是平衡的,您可以使用此负面预测来匹配不在{...}之内的数字:

var str = "nums#1#2#3{#4}#5"; 
 
var arr = str.match(/#\d+(?![^{]*})/g) 
 
    
 
console.log(arr) 
 
//=> ["#1", "#2", "#3", "#5"]

(?![^{]*}是一个数字之后断言负向前查找不匹配之前有}提前{

+1

哇!非常感谢。 –

2

的方式是捕获所有你不希望之前,例如:

var result = txt.replace(/((?:{[^}]*}|[^#{]|#(?!\d))*)(#\d+)/g, '$1 number:$2 '); 
+0

酷!但我实际上想要一串匹配,并且仍然包含大括号 –

+0

@JustJacob:这不是问题,请使用相同的模式并提取捕获组2(在while循环中使用exec方法即可)。 –

1

是,用这一个:(?!{)#\d(?!})

Demo

+1

'(?!{)#'意思是“在这个位置打开的大括号没有跟随,并且有#字符”。它不过是只写'#'。 –

+0

第一组实际上应该是一个负面后视'(?<!\ {)',但是这些在JS中不被支持,所以只有下面的部分在你的正则表达式'#\ d(?!})中是相关的,并且应该是更加喜欢'#\ d +(?![\ d}])' – Thomas

+0

非常酷,并且直截了当地匹配每个没有{之前的{#和d},但在'nums# 1#2#3 {#9}#5##9不是由{}直接填充,并在匹配中返回。但你直接回答了我的问题,并直接表示感谢。 –

0

var str = "nums#1#2#3{#4}#5"; 
 
var result=str.match(/#\d+(?!})/g); 
 
console.log(result);

,你可以这样写太。