簡體   English   中英

如何在javascript中使用正則表達式或正則表達式查找模式的所有實例

[英]How to find all instances of a pattern with regex or regexp in javascript

我有這個字符串

{ prop1: 'val1', prop2:{ prop3: 'val3' ,  messages: {something:'val'}  messages: { something:'val2', x : {x : 1, y : 5} } } , prop4: 'val4' }

如何使用 xregexp(或其他解決方案)在 javascript 中找到所有messages: { ... }實例messages: { ... }

這個/messages: (\\{(?>[^{}]+|(?1))*\\})/g在 php 中工作,但不在 javascript 中

在此處輸入圖片說明

也無法通過使用xregexp遞歸http://xregexp.com/api/#matchRecursive xregexp

試過https://repl.it/@RezaRahmati/xregexp

XRegExp.matchRecursive(str, 'messages: {', '}', 'gi')

Unbalanced delimiter found in string錯誤中Unbalanced delimiter found in string

更新

作為@vs97 和@barmar 的評論,我嘗試了messages: (\\{.+\\})並在多行上工作,當它是單行時仍然會出現問題

在此處輸入圖片說明

不幸的是,由於以下原因, matchBalanced()對此沒有用:

如果分隔符在數據中不平衡,則會引發錯誤。

因此,您不能僅使用它來查找字符串的平衡部分,而只能將其與期望平衡的數據一起使用-它返回最外面的子字符串。 由於您要查找的是嵌套在其中的平衡部件,因此不會返回它們。

使用“郵件”的索引作為起始索引,並使用下一個大括號( } )作為終止索引來對字符串進行slice 使用matchAll還可以簡化過程,因為它“返回與正則表達式匹配字符串的所有結果的迭代器”。

let str = "{ prop1: 'val1', prop2:{ prop3: 'val3' ,  messages: {something:'val'}  messages: { something:'val2', x : {x : 1, y : 5} } } , prop4: 'val4' }";

let msg = str.matchAll(/messages/g);
let messages = [];
for(const m of msg){
  let idx1 = str.indexOf('}', m.index);
  let idx2 = str.slice(idx1+1).search(/\S/) + idx1 +1;
  let endIdx = (str.charAt(idx2) === '}' )? idx2 : idx1;
  messages.push(str.slice(m.index, endIdx+1));
}

messages.forEach(m => console.log(m));

編輯:

更正為在嵌套對象的末尾包含} 根據這個問題,我不希望有三個或三個以上的嵌套層對象。 這僅適用於消息的兩層嵌套對象,例如{{}}形式以及發問者提供的輸入格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM