如何使用正则表达式解析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个数字在那个精确的序列

这个正则表达式,如regex101:所示

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

捕获组([^n]+(?:ns+[^n]+)*)与匹配

  • 任何非换行符:[^n]+
  • 则任意数量的额外行:(?:ns+[^n]+)*

在末尾添加一个负前瞻,以确保换行符后面跟着3位数字。还有一些事情可以用来缩短正则表达式。

(nd{3})[ d]{4}((?:(?!nd{3}).)*)

相关内容

  • 没有找到相关文章

最新更新