我想用正则表达式解析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 ;|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}).)*)