2017-04-13 147 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);

,你可以這樣寫太。