您可以创建一个正则表达式,将作者分为第一组:
^(?:\d+\. )([^:]*)
解释:
-
(?:...)
是一个非捕获群
-
^
是行开始
-
\d+\.
匹配另外一个数字、一个点和一个空格
-
(...)
是一个捕获组
-
[^:]*
匹配除冒号之外的所有内容
如果您想确保仅匹配正确的行,您可以在正则表达式的末尾添加一个前瞻:(?=:)
。所以正则表达式是^(?:\d+\. )([^:]*)(?=:)
Demo here https://regex101.com/r/2Nrzh3/2.
这种方法很好,因为它适用于任意数量的数字。另一方面,这正是我们不能使用后视的原因。
如果您愿意做出假设,即开头可以有 1..4 位数字,那么您可以使用:
((?<=^\d{1}. )|(?<=^\d{2}. )|(?<=^\d{3}. )|(?<=^\d{4}. ))([^:]*)(?=:)
解释:
-
(?<=^\d{3}. )
是从行首开始的 3 位数字的固定长度lookbehind
-
(...|...|...)
用于替代的、固定长度的lookbehind。我知道有点冗长。然而,后视并不是比赛的一部分。
-
([^:]*)
匹配并捕获非冒号字符
-
(?=:)
冒号的前瞻。所以我们只匹配正确的行,但不捕获冒号
Demo here https://regex101.com/r/2Nrzh3/3.
Update
为了只匹配第一作者,我们需要做一些小小的改变:捕获组应该是([^:,]*,[^:,]*)
,完成该行的前瞻应该是(?=[:,])
。这就是捕获器正则表达式的样子:
^(?:\d+\. )([^:,]*,[^:,]*)(?=[:,])
Demo here https://regex101.com/r/2Nrzh3/6.
这就是lookbehinds 的样子:
((?<=^\d{1}. )|(?<=^\d{2}. )|(?<=^\d{3}. )|(?<=^\d{4}. ))([^:,]*,[^:,]*)(?=[:,])
Demo here https://regex101.com/r/2Nrzh3/7.
解释:[^:,]*,[^:,]*
是匹配作者的技巧。每个作者的名字中只有一个逗号,因此我们使用负字符类零次或多次:[^:,]*
,然后匹配一个逗号,并且它们相同的负字符类零次或多次。
您会发现仍然有一些例外,例如在