我试图匹配第一个逗号后出现在字符串中的大写字符(但可能是其他字符)。
我有姓名列表,其中姓氏和名字用逗号分隔。
Stevenson, Barry J. F.
Smith, Julia
我想要匹配那样的东西
B J F
J
我尝试使用类似(?<=, )[A-Z]
的lookbehind表达式,但它只匹配逗号后面的第一个字符。有人可以帮忙吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
据我所知,使用正则表达式执行此操作的唯一方法是\G
(因此某些正则表达式引擎无法执行此表达式):
/(?:,|\G(?!^))[^A-Z]*\K[A-Z]/g
\G
的使用至关重要,因为它让我们从上一场比赛的结尾开始匹配(或者字符串的开头,这就是为什么需要(?!^)
) - 之后的一切逗号。
我还使用\K
“重置”匹配,因此您不需要使用捕获组;但是,您可以使用[^A-Z]*([A-Z])
轻松替换结尾并访问捕获组。
最后,您可以使用延迟点匹配全部(.*?
)而不是[^A-Z]*
;但是,我希望在可能的情况下更加具体。
以下是一个扩展说明:
(?: (?# Start non-capturing group for alternation)
, (?# Match a comma)
| (?# OR)
\G (?# Match the end of the last match)
(?!^) (?# Dont match the beginning)
) (?# End non-capturing group)
[^A-Z]* (?# Match 0+ non-capital letters)
\K (?# Reset the match for clarity)
[A-Z] (?# Match capital letter)