2017-09-04 52 views
0

我想寫一個正則表達式來根據第一個和最後一個字符來分割輸入字符串。用於封閉式語法的JavaScript正則表達式

e.g

input : "$(tag1)sample$(tag2)" 

output : ["$tag1", "sample", "$tag2"] 

var input = $(tag1)sample$(tag2); 
var splitStrings = input.split(/^$|)$/); 

但是,得到以下錯誤:

無效的正則表達式:/^$|)$/:無與倫比 ')'。

回答

0

逃生)性格像這樣:/^$|\)$/

)是在正則表達式中的保留符號,這意味着你必須告訴引擎把它當作一個字符,這是什麼呢\

1

注意$)是特殊的正則表達式元字符 - 如果你需要逐字匹配這些字符 - must be escaped或投入[...]字符類。

但是,在這種情況下,轉義它們不適用於您。您可以與/(\$\([^()]+\))/分割,刪除空的條目,並刪除括號在預選賽:

​​

這裏的要點是:

劈開 (\$\([^()]+\))
  • ,我們得到的一個數組$(...)以及與此模式不匹配的所有文本塊
  • 我們需要從數組中刪除空字符串這通常會用這種分割操作(因此,filter(Boolean)或類似應使用)的
  • 我們需要在那名匹配與分裂模式
  • .replace(/^\$\((.*)\)$/, '$$$1')條目與$更換$(),替換有3 $ s,因爲要替換爲單個$,我們需要在字符串替換模式中將其加倍,第三個形成反向引用$1
0

錯誤的原因是您必須轉義在正則表達式中具有特殊含義的字符,如)$

但只是修復,不會讓你到你想要的輸出,你想在特殊標籤上拆分的地方,刪除標籤中的(),並保留它們。我不認爲有這樣一個正則表達式的解決方案與JavaScript的正則表達式(也許有人比我知道一種方式更聰明,但隨着轉換$(tag1)$tag1我沒有達到那裏)。但是,我們可以用一對夫婦取代了和分裂路線:

var input = "$(tag1)sample$(tag2)"; 
 
var splitStrings = input.replace(/\$\(([^)]+)\)/g, "\t$$$1\t") 
 
         .replace(/(?:^\t+)|(?:\t+$)/g, '') 
 
         .split(/\t+/); 
 
console.log(splitStrings);

。第一替代變換$(tag1)\t$tag1\t(例如,把它周圍的標籤,並刪除())。第二個替換擺脫了任何前導和尾隨選項卡。然後拆分在任何選項卡序列上分割。

當然,如果選項卡可能出現在字符串中,而您想保留它們,只需將其替換爲適合的任何其他選項。