2016-07-29 24 views
1

我想用正則表達式解析MARC記錄,並返回該字段作爲第一個捕獲的組,並將該值作爲第二個捕獲的組。下面是我有迄今爲正則表達式:如何使用正則表達式解析MARC記錄?

(\n[0-9]{3})[ 0-9]{4}([^\n]*) 

最後捕獲組有([^\n]*)被捕獲的一切,直到下一次換行,這與像線的偉大工程:

001 868229892 
100 1 Montgomery, L. M.|q(Lucy Maud),|d1874-1942.,|eauthor. 
245 10 Anne of Green Gables /|cL.M. Montgomery. 
250 Aladdin hardcover edition. 
264 1 New York :|bAladdin,|c2014. 
300 440 pages &#59;|c22 cm 
336 text|2rdacontent. 
337 unmediated|2rdamedia. 
338 volume|2rdacarrier. 

然而,當談到這打破了線值,正則表達式不再起作用:

520 Anne, an eleven-year-old orphan, is sent by mistake to 
     live with a lonely, middle-aged brother and sister on a 
     Prince Edward Island farm and proceeds to make an 
     indelible impression on everyone around her. 
650 0 Shirley, Anne (Fictitious character)|vJuvenile fiction. 

下一站面積應高於650 。所以正則表達式應該捕獲所有東西,直到換行符後跟3位數字

我確實嘗試過([^\n0-9]*),但這被解釋爲以任何順序匹配任何非數字或換行符的任何順序。我需要它匹配一個換行符和3位數字,其確切順序是

回答

1

這此正則表達式,這表現在regex101

(\n[0-9]{3})[ 0-9]{4}([^\n]+(?:\n\s+[^\n]+)*)

捕獲組([^\n]+(?:\n\s+[^\n]+)*)匹配

  • 任何非換行符:[^\n]+
  • 然後任意數量的額外的行:(?:\n\s+[^\n]+)*
0

爲了確保換行符後面跟着3位數字,在末尾添加負向預覽。還有一些可以縮短正則表達式的方法。

(\n\d{3})[ \d]{4}((?:(?!\n\d{3}).)*) 
+0

它不工作。 – JakeParis

+0

適用於regex101。 – RamenChef