2013-12-12 24 views
2

我想這個文本拆分成故事中的各種不同的角色,但你可以看到有存儲在括號和括號備註等數據:更換支架之間的分號在Javascript

var string = "Batman [Bruce Wayne; also as Two-Face]; Joker; Ra's al Ghul; Mr. Freeze; Killer Moth; Poison Ivy; Mad Hatter; Spook; Scarecrow; Captain Stingaree; Cavalier; Cluemaster; Signalman; Batman [Jerry Randall]; Tweedle Dum; Tweedle Dee; Catwoman; Riddler; Lex Luthor; Superman; Two-Face; Commissioner Jim Gordon; Arkham Asylum"; 

一般來說,你可以像這樣拆分此字符串:

string.split(';') 

,你會得到相當接近,但也有地方有中括號或括號之間用分號隔開的情況。所以在這種情況下,「蝙蝠俠」會分成兩個角色。

問題: 如何在拆分之前刪除括號和括號內的分號?

我想這樣的正則表達式:

characters.replace('/(\[[^)]*);([^)]*\])/', '$1$2') 

但似乎並沒有工作。有任何想法嗎?

+0

聽起來像一個[XY問題](http://meta.stackexchange.com/q/66377/153542),我建議寫一個簡單的解析器(它們並不那麼難)。 – zzzzBov

+0

你想要輸出什麼:('蝙蝠俠','小丑')或('蝙蝠俠','布魯斯韋恩','也是雙面','小丑',...) – bcorso

+0

我想有額外的「數據」進行進一步處理,所以它會像(蝙蝠俠[布魯斯韋恩也作爲雙面],小丑,Ra's al Ghul) – delimited

回答

1

這種模式應該這樣做/;(?=((?!\[).)*?\])/gdemo

匹配分號外支架/;(?=(((?!\]).)*\[)|[^\[\]]*$)/gDemo

+0

只匹配第一個實例,除非OP提供更多的信息,我懷疑他想要 –

+1

@Esteban Felix當在演示中使用g修飾符時,它將匹配括號內的所有分號 –

+0

好主...在js中做了正則表達式太久了,並且不知道它可能會看看/背後:facepalm: – OhkaBaka

0

給你:

/(\[.*?);(.*?\])/g 

例子:

var string = "Batman [Bruce Wayne; also as Two-Face]; Joker; Ra's al Ghul; Mr. Freeze; Killer Moth; Poison Ivy; Mad Hatter; Spook; Scarecrow; Captain Stingaree; Cavalier; Cluemaster; Signalman; Batman [Jerry Randall]; Tweedle Dum; Tweedle Dee; Catwoman; Riddler; Lex Luthor; Superman; Two-Face; Commissioner Jim Gordon; Arkham Asylum"; 
string.replace(/(\[.*?);(.*?\])/g, '$1$2') 

"Batman [Bruce Wayne also as Two-Face]; Joker; Ra's al Ghul; Mr. Freeze; Killer Moth; Poison Ivy; Mad Hatter; Spook; Scarecrow; Captain Stingaree; Cavalier; Cluemaster; Signalman; Batman [Jerry Randall]; Tweedle Dum; Tweedle Dee; Catwoman; Riddler; Lex Luthor; Superman; Two-Face; Commissioner Jim Gordon; Arkham Asylum" 
0

你可以刪除它們,或只是保護括號內的那些相同的方式...

替換要保護與自然是不會發生的任意字符串半冒號:

string.replace(/([\[\(][^\[\(\]\)]+);([^\[\(\]\)]+[\]\)])/g,'$1~~$2') 

更換剩下的分號用不同的任意字符串不會自然發生(和清理這些空格):

.replace(/; */g,"^^") 

開關保護的弦回分號:

.replace(/~~/g,";") 

分割你還剩下什麼:

.split("^^"); 

...應該給你你想要的結果。

+0

是的,我喜歡這個將它改爲任意字符串的想法,有助於進一步處理。 – delimited

0

你不需要,如果您使用此代碼分裂之前刪除;方括號內:

result = string.split(/\s*;\s*(?![^[]*])/); 

(我加\s*修剪開頭和結尾的空格)