我发了一个文字,我希望以粗体显示所有文字。因此,不依赖于前缀,即序列号,我可以使用正则表达式匹配粗体字符吗?
答案 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)
我可以在您的示例中的每一行上识别这种常见模式:
使用非捕获运算符,转换为:
^(?:\d+\. )([^,]*,[^,:]*)
通过使用look-behind运算符替换非捕获运算符来替代:
(?<=\d\. )([^,]*,[^,:]*)
要明确解决http://play.inginf.units.it/#/level/12,那么您需要OR运算符:
(?<=^.. |^... |^.... )([^,]*,[^,:]*)
答案 2 :(得分:-1)
我的解决方案
(?<=^\d+\.\s)(\w+,[\s\w\.]*)