ABC 是一種音樂符號;我正在研究將其作為應用程式的一部分進行決議的模式。
有時,ABC 檔案中包含一個曲子的多個版本,而我只需要獲得第一個版本,或者在一個理想的世界中,我指定的任何版本。 一個演繹的開始是由X: 字串表示的。
我們不可能事先知道一個檔案中有多少個演繹。
在 Javascript 中,我怎樣才能在下面的例子中回傳第一個演繹(從第一個 X: 包括到第二個演繹的開始),如果沒有第二個演繹,則回傳第一個演繹,如果有兩個以上的演繹,則回傳第一個演繹。
到目前為止,我的作業產生了([sS]*)(?=X:),它在兩個演繹的例子中成功,但在單一演繹或兩個以上的演繹中失敗。
在lookahead中添加一個'OR'd檔案末尾的條件,可以讓單次演繹的情況成功,但在一次和三次演繹的情況下失敗,例如:([sS]*)(?=X:|$)
感謝任何幫助......一種決議ABC的好方法將被許多人使用。
一個雙版本的例子可以像下面這樣 -- 對于一個三版本的例子,只需在末尾添加一行X:,而對于一個單一的例子,從第二個X:
編輯。大家都很好地要求提供更好的例子,而這些例子在評論中是放不下的,所以這里有一些
破碎的誓言是一個很好的例子。
破碎的誓言很有趣,因為它有不止一個ABC,而且它們不是按順序編號的:
破碎的誓言很有趣。
X: 56
T:Broken Pledge, The
R: reel
D:De Danan: 選擇 卷軸和夾具。
Z:Also played in Edor, see #734
Z:id:hn-reel-56。
M:C?
K:Dor
dcAG ADDB|cAGF ECCE|D2 (3EFG Addc|AcGc Aefe|
dcAG FGAB|c2Bd cAGE|D2 (3EFG 添加B|cAGE FDD2:|
Acde|~f3d ecAB|cAGE GAcd|ec~c2 eage|.
dcAG Acde|fedf ecAG|~F3G AddB|cAGE FDD2:|
P:"Variations:"?
|: dcAG ~A3B|cAGF ECCE|DEFG Addc|(3ABc Gc Aefe|(3ABc)
dcAG FGAB|c2Bd cAGE|DEFG AddB|A2GE FDD2:|
Acde|~f3d ecAB|cAGE GAcd|ec~c2 eage|。
dcAG Acde|~f3d ecAG|FEFG AddB|A2GE FDD2:|
X:2
T:Broken Pledge, The
M:C
L:1/8
Q:250。
K:D
dcAG A2 dB | cAGF EDC2 | DEFG Ad ~d2 | AcGc Adfe |
dcAG A2 dB | cAGF EDC2 | DEFG Ad ~d2 | AcGc ADD2 :|。
|: dcAG A2 de | fedf edAB | cAGE GAcd | ec ~c2 eage |
dcAG A2 de | fedf edcA | F3 E FGAB | cAGE {F}ED D2 :||
《惠施貓》很有趣,因為它有很多的演繹,所有的編號都是一樣的。 你可以看到X:whatever是完全任意的:
X: 1
T:Huish Cat。
M:6/8。
L:1/8。
N:"作者和日期未知。"
R:空氣。
Q:"Quick"。
S:Byrne, the harper, 1802。
B。 Bunting - Ancient Music音樂 的 愛爾蘭 (1840, p. 3)
Z:AK/Fiddler的Companion。
K:C
(G>A).G c2(e|d<).d.A c2z|(G>A)。 G.c2 d|(ec).A.A2G|
(G>A).G .c2(e|d<).d.A 。 c2e|(g>f).e.f2d|(ec).A A2G:|
|:(gf).e .f2d|(ed).c . f2d|(gf).e .f2d|(ec).A A2G|
(gf).e.f2d|(ed).c.f2。 d|(G>A).G f2d|(ec).A [F2A2]G:|]
X:1
T:Huntthe Cat
M:6/8。
L:1/8。
R:吉格
Q:"Allegro"
B: William Forde - 300 National 旋律 的 英國 伊斯拉(c. 1841, p. 26, no. 87)
B: https://www.itma.ie/digital-library/text/300-national-melodies-of-the-british-isles.-vol.-3-100.-irish-airs。
N:William Forde (c. 1795-1850)是一位音樂家、音樂收藏家和學者來自 County Cork。
Z:AK/Fiddler的Companion。
K:D
A>BA d2f|e<eB d3|A>BA d2e|fdB B2A|
A>BA d2f|e<eB d2f|a>gf g2e|fdB B2A:|?
FED G2E|agf g2e|fdB B2A|:agf g2e|fDB
agf g2e|fed g2e|A>BA g2e|fdB B2A:|]
X:1
T:Huish Cat。
M:6/8。
L:1/8。
R:吉格
Q:"Quick"。
B: P.M. Haverty - One Hundred Irish Airs 卷。1(1858,No。87, p. 37)
Z:AK/Fiddler的Companion。
K:C
(G>A).G.c2(e|d<).d.A c2z|(G>A)。 G.c2d|(ec).A.A2G|
(G>A).G .c2(e|d<).d.A 。 c2|(g>f).e.f2d|(cA).A A2G:|
|:(gf).e .f2d|(ed).c . f2d|(gf).e .f2d|(ec).A A2G|
(gf).e.f2d|(ed).c.f2。 d|(G>A).G f2d|(ec).A [ F2A2] G:|]
X:1
T:Huish Cat
M:6/8。
L:1/8。
R:Single JigS:O'Neill - Dance Music of Ireland: 1001 Gems (1907), No.382
Z:AK/Fiddler's Companion。
K:C
G>AG c2e|d<dA c2e|G>AG c2d|ecA A2c|
G>AG c2e|d<dA c2e|g>fe f2d|ecA A2G:?
|????????
gfe f2d|edc f2d|G>AG f2d|ecA A2G:||。
X:1
T:Huntthe Cat
M:6/8。
L:1/8。
B:Roche, vol. 3(1927, p. 114)
K:Ddor。
DED D2A|AGE c3|DED D2A|AGE E2D|
DED D2A|AGE c3|ABc d2B AGE E2D :|
|:dcA AGE|AGE c3|dcA AGE|AGE E2D|
dcA AGE|AGE c3|ABc d2c|AGE E2D:||
低頭族是相當混亂的,有百分之一的標志和類似的東西
。X: 1
%
T:Lowbacked Car [1], The>
M: 6/8
L:1/8。
R:空氣。
S:James Goodman(1828─1896)音樂手稿集。
S:卷。3, p. 133. 中世紀,郡 科克
Z:AK/Fiddler的Companion。
K:G
G|G2B B2d|c2A z2F|G2B d2d|d3 z2G|
G2c A2A|B2B G2B|c2A G2F|G3 z2G|
G2c c2e|e2d d2G|G2c c2e|d3 z2G|
G2g !fermata! g2e|e2d dcB|A2G A2B|!fermata! d3 z2A|!
GED G2G|G3 z2B|AGE A2A|A3z B/c/|
dcB dcB|gfe !"fermata! d2 B/A/|GED G2G|(G3 G2)||
X:1
%
T:Low Backed Car (1)
M:6/8。
L:1/8。
B:Howe - Musicians的Omnibus No.2(第107頁
Z:AK/Fiddler's Companion。
R:G
G|G2B B2d|c3 A2d|G2 B2 d2d|(d3 d2)B|
c2c A2A|B3 G2G A2A F2F|(G3 G2)||d|
d2g g2e|e2d|d2B|d2g g2e|(e3 d2)|d|
d2g g2e|e2d d2B|BAG A2B|d2c B2A|.
.G.E.E.G2G|(G3 G2)B|AGE A2A|A3 ABc|
(.d.c.B) (.d。 c.B)|(.a.a。 d) .e.d.B|. G.E.D|(G3 G2)|] 。
X:1
%
T: Low Backed Car [1], The
M: 6/8
L:1/8。
R:吉格
B:Kerr - Merry Melodies,vol. 2, No. 257 (c. 1880's)
Z:AK/Fiddler's 伴侶
K:G
D|G2B B2d|d2c A2F|G2B d2d|(d3 d2) B|
cBc A2A|BAB GAB|c2A G2F|(G3 G2):||
??|G2g g2e|e2d d2B|G2g g2e|d3 cBA|
G2g g2e|e2d dcB|A2G A2B|d3 cBA|
GED G2G|(G3 G2)B|AGE A2A|A3 (ABc)|
dcB dcB|Gfe dBA|GED G2G|(G3 G2)||
而Lowbacked Car for 6是單調的模式情況,我們需要處理的是最常見的情況:
。
X: 1
T:Jaunting Car for Six
M:9/8。
L:1/8。
R:Slip JigS:Kerr - Merry Melodies, vol. II. 3, No. 233 (c. 1880's)
Z:AK/Fiddler's Companion。
K:A
efe c2c c3|efe cde fga|efe c2c c3|BcB B2c def:|
BcB B2c def:||e2a agf ecA|e2a agf e3|e2a agf ecA|BcB2c def:|||
uj5u.com熱心網友回復:
這是一個完全重寫的答案,抱歉。下面的函式回傳你目前感興趣的資訊(它可以被擴展以回傳更多的資訊,例如,作為一個與renditions陣列共享索引的陣列的演繹的標題)。
function getAbcInfo(abc) {
let renditions = ('
' abc).split(/[
] (?=[ u00a0]*X[ u00a0]*: [ u00a0]*d )/)。
renditions.push(renditions.pop()。replace(/[
] $/, ''))
renditions.unshift(renditions.shift().replace(/^[ ] /),')。
] /, '')
let x = [''/span>]
let indicesOfX = {''/span>: [0]}。
for (let i = 1; i < renditions.length; i ) {
let n = renditions[i].match(/^[ u00a0]*X[ u00a0]*:[ u00a0]*(d )/) [1 ]
x[i] = n
if (n in indicesOfX) {
indicesOfX[n].push(i)
} else {
indicesOfX[n] = [i] 。
}
}
return {renditions: renditions, x: x, indicesOfX: indicesOfX}.
}
console.log(JSON. stringify(getAbcInfo(brokenPledge))。
// {"renditions":["","X:56…","X:2…"],"x":["","56","2"],"indicesOfX":{"2":[2],"56":[1],"":[0]}}
console.log(JSON. stringify(getAbcInfo(huishTheCat))。
// {"renditions":["","X:1…","X:1….","X:1…","X:1…","X:1…"],"x":["","1","1","1","1","1"],"indicesOfX":{"1":[1,2,3,4,5],"":[0]}}
console.log(JSON. stringify(getAbcInfo(lowbackedCar))。
// {"renditions":["","X:1…","X:1…","X:1…"],"x":["","1","1","1"],"indicesOfX":{"1":[1,2,3],"":[0]}}
console.log(JSON. stringify(getAbcInfo(commonCase))。
// {"renditions":["","X:1…"],"x":["","1"],"indicesOfX":{"1":[1],"":[0]}}
console.log(JSON. stringify(getAbcInfo(brokenPledgeWithoutTheFirstLine))。
// {"renditions":["T:Broken Pledge…","X:2…"],"x":["","2"],"indicesOfX":{"2":[1],"":[0]}}
renditions陣列總是包含在索引0的第一個X:(如果有)之前的內容。這通常是一個空字串,但它可能是一個帶有標準允許的欄位的頭,或者甚至是一個完整的演繹,如果它的X:行被簡單地省略了(違反標準,但人類并不總是遵循標準)。
從索引1開始,renditions的專案是以X:開始的演繹(實際上是允許空白的,見regex),并且洗掉了尾部的新行。
x陣列與renditions陣列共享索引,給出了每個rendition中X:n行的n。由于索引0處的 "rendition "沒有X:n行(它是 "未命名的",或者說,"未編號的"),x陣列在索引0處總是有空字串。
indicesOfX物件允許你獲得renditions中的索引陣列,并給出X:n的n。換句話說,它顛倒了x陣列的鍵-值關系。
如果你想擴展這個函式來添加,比如說,一個titles陣列到輸出中,不要忘記你不能簡單地匹配一個T:,因為你必須考慮到空白(我使用的重碼允許空格、制表符和非斷裂空格 - 不要使用s*因為它包括
),還因為T: 必須前面有一個換行,除了在索引0處的演繹,它可以在字串的開頭。T:的文本以換行結束([
])。
BTW,你可能想通過替換所有的來 "規范化 "換行。
,或者,如果你擔心周圍可能有舊的Mac Classic檔案,其中的換行符只是,將所有替換為。
替換為。
,然后用替換所有剩余的。
與。
。一旦你確定你沒有周圍的新行,你可以匹配。
新行,你可以通過使用^和m(多行)標志,同時匹配新行的開始和字串的開始。
uj5u.com熱心網友回復:
如果你想從X:開始的資料中獲得第n個部分,或者從字串的開始,你可以使用一個捕獲組來捕獲你想保留的內容,并使用一個量詞來重復n前面的部分作為匹配。
在Javascript中的模式,例如用量詞{3}
Javascript不支持占有式量詞,但是你可以模仿它,在lookahead中使用一個捕獲組來獲取你想要的東西,然后使用反向參考來匹配它,因為在lookahead中不存在回溯。
/^(?:(?=([sS] ?(?=X:|$))1){3}/g
該模式匹配:
^字串的開始(?:非捕獲組(?=正數看頭([sS] ?(?=X:|$))至少匹配1次以上的字符,并斷言X:或右邊的字串結束
)關閉看頭1反向參考,以匹配捕獲組1的值 。
){3}關閉非捕獲組,并重復n次,在本例中是3次
如果X:應該在換行之后,你可以在它之前預加一個換行:
/^(?:(?=([sS] ?(?=nX:|$))1){2}/g
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323801.html
標籤:
下一篇:在Ruby中壓縮2個以上的變數
