2015-10-13 159 views
0
var textoNotes = "e|-----------------|B|-----------------|G|-----------------|D|-----------------|A|-----------------|E|3-3-3-3-3-3-3-3-3|"; 

var filterChords = /(\(|[^(e|B|G|D|A|E)|]+|\))/g; 

var arr = filterChords.exec(textoNotes); 

這將返回:不能使正則表達式工作

arr[0] = ----------------- 
arr[1] = ----------------- 

但是,這就是我想要的:

arr[0] = ----------------- 
arr[1] = ----------------- 
arr[2] = ----------------- 
arr[3] = ----------------- 
arr[4] = ----------------- 
arr[5] = 3-3-3-3-3-3-3-3-3 

感謝大家,並在此之後我想獲取每個值的不同值。

+6

什麼是你想要的輸出?讓自己更清楚。 – pzp

+0

你在https://regex101.com上測試了你的正則表達式嗎?看起來很好,如果我正確理解你的話。 –

+0

是的,NAD在正則表達式中工作,但在這裏沒有。 –

回答

1

請注意,當您嘗試在字符類中使用組時,您的正則表達式會出現異常。在(\(|[^(e|B|G|D|A|E)|]+|\)),你有3種選擇:

1)\(匹配literak ( 2)[^(e|B|G|D|A|E)|]+( 1個或多個字符匹配等,e ... 3)\)匹配文字)

您可以使用下面的正則表達式:

[eBGDAE]\|[^|]+\| 

regex demo

正則表達式:

  • [eBGDAE] - 與從範圍
  • \| 1個字母 - 匹配的文字|
  • [^|]+ - 除了|以外的其他1個字符
  • \| -1字面|

需要注意的是,確保你在開始匹配1個字母,您可以使用\b字邊界:

\b[eBGDAE]\|[^|]+\| 

JS片段:

var re = /\b[eBGDAE]\|[^|]+\|/g; 
 
var str = 'e|-----------------|B|-----------------|G|-----------------|D|-----------------|A|-----------------|E|3-3-3-3-3-3-3-3-3|'; 
 
var res = []; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[0]);  
 
    document.getElementById("r").innerHTML += m[0] + "<br/>"; 
 
}
<div id="r"/>

res將包含所需值的數組,an d document...僅供演示。

0

你的正則表達式與你想要的似乎不符。我會嘗試使用下面的東西(假設我正確理解你的問題,因爲它有點不清楚)。

text.match(/[e|B|G|D|A|E]\|(.+)\|/g); 

str.match()將輸出一個值數組。

一個測試您的正則表達式的好地方是http://www.regexr.com或其他類似的網站。

0

你爲什麼不試試這個:

text.match(/[^\|eBGDAE]+/g); 

這將只匹配不在此列表包括管道上的任何字符流?

0

所以|是你應該逃避這個存在於[]以外的特殊字符之一;

<script> 
var textoNotes = "e|-----------------|B|-----------------|G|-----------------|D|-----------------|A|-----------------|E|3-3-3-3-3-3-3-3-3|"; 
var filterChords = /[eBGDAE]\|[^eBGDAE|]+\|/g; 
var arr; 
while (arr = filterChords.exec(textoNotes)) { 
    alert(arr); 
} 
</script>