我可以使用正则表达式匹配粗体文本吗?

时间:2018-03-13 08:26:33

标签: regex

我发了一个文字,我希望以粗体显示所有文字。因此,不依赖于前缀,即序列号,我可以使用正则表达式匹配粗体字符吗?

  1. Spalding,K.L。,Buchholz,B.A.,Bergman,L.E.,Druid,H.,Frisén,J。:Forensics:e age by teeth tests in teeth。 Nature 437(7057)(2005)333-334
  2. Lovecraft,H.P。:HP Lovecraft:Tales:Tales。美国图书馆(2005年)
  3. Duncan,R。:对并行计算机架构的调查。计算机23(2)(1990)5-16
  4. Santos,N。,Hoshino,Y。:轮状病毒血清型/基因型的全球分布及其对开发和实施有效轮状病毒疫苗的意义。医学病毒学15(1)(2005)29-56
  5. 的评论
  6. DIARRHEA,R。:轮状病毒和其他病毒性腹泻。世界卫生组织公报58(2)(1980)183-198
  7. Barton,T。:权力和知识:罗马帝国统治下的占星术,地貌学和医学。密歇根大学出版社(2002年)
  8. 高奎林,M。:宇宙时钟:从占星术到现代科学。 H. Regnery Company(1967)

3 个答案:

答案 0 :(得分:2)

您可以创建一个将作者分组到第一组的正则表达式:

^(?:\d+\. )([^:]*)

说明:

  • (?:...)是一个非捕获组
  • ^是行开始
  • \d+\.再匹配一个数字,一个点和一个空格
  • (...)是一个捕获组
  • [^:]*匹配不是冒号的所有内容

如果要确保只匹配正确的行,可以在正则表达式的末尾添加前瞻:(?=:)。因此正则表达式将是^(?:\d+\. )([^:]*)(?=:)

演示here

这种方法没问题,因为它适用于任何数量的挖掘者。另一方面,这正是我们不能使用lookbehinds的原因。

如果您愿意做出假设,即开头可能有1位数,那么您可以使用:

((?<=^\d{1}. )|(?<=^\d{2}. )|(?<=^\d{3}. )|(?<=^\d{4}. ))([^:]*)(?=:)

说明:

  • (?<=^\d{3}. )是一个固定长度的后视,从该行的开头起3位数
  • (...|...|...)用于替代的固定长度的后视镜。我知道,有点冗长。然而,外观并不是比赛的一部分。
  • ([^:]*)匹配并捕获非冒号字符
  • (?=:)对结肠的预测。所以我们只匹配正确的行,但不捕获冒号

演示here

更新

要仅匹配第一位作者,我们需要稍作修改:捕获组应为([^:,]*,[^:,]*),完成该行的前瞻应为(?=[:,])。所以这就是捕获器正则表达式的样子:

^(?:\d+\. )([^:,]*,[^:,]*)(?=[:,])

演示here

这就是lookbehinds的样子:

((?<=^\d{1}. )|(?<=^\d{2}. )|(?<=^\d{3}. )|(?<=^\d{4}. ))([^:,]*,[^:,]*)(?=[:,])

演示here

说明:[^:,]*,[^:,]*是匹配作者的技巧。每个作者的名字只有一个逗号,所以我们使用负字符类零次或多次:[^:,]*,然后匹配一个逗号,它们是相同的负字符类零次或多次。

您会看到仍有一些例外,例如在

答案 1 :(得分:1)

我可以在您的示例中的每一行上识别这种常见模式:

  • 数字+点+空格
  • (文字+逗号+文字)以粗体显示
  • 逗号或冒号+任何

解决方案1 ​​

使用非捕获运算符,转换为:

^(?:\d+\. )([^,]*,[^,:]*)

demo

解决方案2

通过使用look-behind运算符替换非捕获运算符来替代:

(?<=\d\. )([^,]*,[^,:]*)

demo

解决方案3

要明确解决http://play.inginf.units.it/#/level/12,那么您需要OR运算符:

(?<=^.. |^... |^.... )([^,]*,[^,:]*)

demo

答案 2 :(得分:-1)

我的解决方案

(?<=^\d+\.\s)(\w+,[\s\w\.]*)