2015-10-13 162 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>