我有一个文本打击,我想匹配所有粗体文本。因此,在不依赖前缀(即序列号)的情况下,我可以使用正则表达式仅匹配粗体字符吗?
- Spalding, K.L.、Buchholz, B.A.、Bergman, L.E.、Druid, H.、Frisén, J.:法医:核试验写在 dentry 上的时代。自然437(7057)(2005)333–334
- Lovecraft, H.P.:HP Lovecraft:故事:故事。美国图书馆(2005)
- Duncan, R.:并行计算机体系结构调查。计算机 23(2) (1990) 5–16
- Santos, N.、Hoshino, Y.:轮状病毒血清型/基因型的全局分布及其对有效轮状病毒疫苗开发和实现的影响。医学病毒学综述 15(1) (2005) 29–56
- 腹泻,R.:轮状病毒和其他病毒性腹泻。世界卫生组织公报 58(2) (1980) 183–198
- Barton, T.:权力与知识:罗马帝国时期的占星学、面相学和医学。密歇根大学出版社(2002)
- Gauquelin, M.:宇宙钟:从占星学到现代科学。 H. Regnery 公司 (1967)
最佳答案
您可以创建一个正则表达式,将作者分为第一组:
^(?:\d+\. )([^:]*)
说明:
-
(?:...)
是一个非捕获组 -
^
是行开始 -
\d+\.
匹配另外一个数字、一个点和一个空格 -
(...)
是一个捕获组 -
[^:]*
匹配除冒号之外的所有内容
如果您想确保仅匹配正确的行,您可以在正则表达式的末尾添加前瞻:(?=:)
。所以正则表达式将是 ^(?:\d+\. )([^:]*)(?=:)
演示 here .
这种方法很好,因为它适用于任意数量的数字。另一方面,这正是我们不能使用lookbehinds的原因。
如果您愿意做出假设,即开头可以有 1..4 位数字,那么您可以使用:
((?<=^\d{1}. )|(?<=^\d{2}. )|(?<=^\d{3}. )|(?<=^\d{4}. ))([^:]*)(?=:)
说明:
-
(?<=^\d{3}. )
是从行首开始的 3 位数字的固定长度lookbehind -
(...|...|...)
用于替代的、固定长度的lookbehind。我知道有点冗长。然而,后视不是匹配的一部分。 -
([^:]*)
匹配并捕获非冒号字符 -
(?=:)
冒号的前瞻。所以我们只匹配正确的行,但不捕获冒号
演示 here .
更新
为了只匹配第一作者,我们需要做一些小小的改变:捕获组应该是 ([^:,]*,[^:,]*)
,完成该行的前瞻应该是 (?=[:,])
。这就是捕获器正则表达式的样子:
^(?:\d+\. )([^:,]*,[^:,]*)(?=[:,])
演示 here .
这就是lookbehinds的样子:
((?<=^\d{1}. )|(?<=^\d{2}. )|(?<=^\d{3}. )|(?<=^\d{4}. ))([^:,]*,[^:,]*)(?=[:,])
演示 here .
说明:[^:,]*,[^:,]*
是匹配作者的技巧。每个作者的名字中只有一个逗号,因此我们使用负字符类零次或多次:[^:,]*
,然后匹配一个逗号,并且它们相同的负字符类零次或多次。
你会发现仍然有一些异常(exception),例如在
关于regex - 我可以使用正则表达式匹配粗体文本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49251418/