2017-01-01 38 views
2

之間走散的比賽有什麼我可以用它來分析以下文本的正則表達式:JavaScript的正則表達式來兩個短語

Mission m1 
"Mission a is completing exam" 
End Mission 
Something is not necessary 
Task t1 
"Task b is keeping house" 
comment: "... End Task" 
End Task 
abc 
Task t2 
Do something 
End Task 

..所以它看起來像下面這樣:

[1]: 
Mission m1 
"Mission a is completing exam" 
End Mission 

[2]: 
Task t2 
Do something 
End Task 

[3]: 
Task t2 
Do something 
End Task 

我試過這個正則表達式\b(?:Mission|Task)\b(.|\n)*\b(?:Mission|Task)\b - 問題是它只返回一個包含三個部分的結果。

+0

使用'split'功能。 –

+0

拆分雙新行:'s.split( 「\ n \ n」)'。或者使用's.split(/ ^(=任務?|團)/ M)' –

回答

1

你的正則表達式似乎沒問題,儘管可能(^|\n)(Mission|Task)已經足夠滿足你的需求了(找到所有以'Mission'或'Task'開頭的行,原因是我認爲你的最終目標不需要匹配整個段落 - 參見下面)。你的主要問題可能是你不使用global modifier

pattern=/(^|\n)(Mission|Task)/g; 

另一個問題是(我認爲)你XYing這一點。我認爲,上述正則表達式和replace會更容易在這裏,但既然你要爲每場比賽不同的替代,你不能只使用replace

yourText.replace(pattern,constantString) 

可以解決這個使用函數和全局變量:

var index = 1; 
yourText.replace(pattern,function(x){ return "P"+(index++)+"\n"+x;}) 

/g會造成取代對字符串匹配的所有工作。如果你仍然想使用你的模式,只需添加/g

編輯 忘記張貼fiddle

2

這是以前的答案完全重寫,因爲你的投入是從你開始表現出大不相同。

你需要一個簡單的正則表達式匹配兩個字符串之間的字符串:

/^(Mission|Task)\b[\s\S]*?^End \1$/mg 

這裏是一樣的正則表達式的unrolled version

/^(Mission|Task)\b.*(?:\r?\n(?!End \1).*)*\r?\nEnd \1$/gm 

regex demo

詳細

  • ^ - 無論是MissionTask整個單詞
  • [\s\S]*? - - 線
  • (Mission|Task)\b開始任何0+字符,儘可能少到第一...
  • ^End \1$ - End,空間將該詞捕獲到第1組中,作爲整個行。
+0

嘛!我打算查找具有結構「任務...結束任務」或「任務...結束任務」的文本塊。並且塊外有一些不必要的字符串與結果不匹配。 – user3120188

+0

我檢查了您的新輸入並相應地更新了答案。 –