正则表达式 - 匹配给定模式后的特定字符

时间:2016-10-24 18:56:53

标签: regex

我试图匹配第一个逗号后出现在字符串中的大写字符(但可能是其他字符)。

我有姓名列表,其中姓氏和名字用逗号分隔。

Stevenson, Barry J. F.
Smith, Julia

我想要匹配那样的东西

B J F
J

我尝试使用类似(?<=, )[A-Z]的lookbehind表达式,但它只匹配逗号后面的第一个字符。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您只需删除逗号,它就会匹配您想要的内容:

(?<= )[A-Z]

<强> Working demo

enter image description here

答案 1 :(得分:0)

据我所知,使用正则表达式执行此操作的唯一方法是\G(因此某些正则表达式引擎无法执行此表达式):

/(?:,|\G(?!^))[^A-Z]*\K[A-Z]/g

Demo.

\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)