0

我想匹配在“用户”一词之前每个第一个字符都大写的短语。

例如:

我有一个字符串:给 Apple 平板电脑用户或给苹果平板电脑用户的任何东西

匹配后的结果必须是: Apple Table

任何没有第一个字符大写的地方 Abc 用户 => Abc

任何没有第一个字符大写的地方 Abc Def 用户 => Abc Def

任何没有第一个字符大写的地方 Abc Def Xyz 用户 => Abc Def Xyz

我尝试过:(((?-i)[A-Z][a-z]*) )*users 但它只匹配第一个单词 -平板电脑

4

3 回答 3

1

这只是正确分组的问题:

((?:(?-i)[A-Z][a-z]* )*)users

如果您不想获得捕获中的最后一个空间,您也许可以这样做:

((?:(?-i)[A-Z][a-z]* ??)*?)\s*users

正则表达式101演示


(((?-i)[A-Z][a-z]*) )*
^^----------------^ ^
|_________1_________|
          2

第一个(内部)捕获处理单词,第二个(外部)捕获添加空间。您可以轻松地将两者组合在一个组中(因此您可以(?:(?-i)[A-Z][a-z]* )在我的正则表达式中找到。

然后问题是最后一次捕获正在重复,这就是导致仅Tablet在第一个捕获组中捕获的原因。与我建议的正则表达式中不重复最终捕获组的方式进行比较。

于 2013-09-20T05:24:17.640 回答
1

您可以使用量化来匹配多个大写单词。然后使用前瞻查找用户,但不将其包含在结果中。

(?:\b[A-Z][a-z]*\s*)+(?=\busers\b)

雷伊

REY有一个包含所有样本数据的工作示例。

于 2013-09-20T05:26:24.473 回答
0

这应该工作

(([A-Z]+[\w-]*[\s])+users)

比赛如下

在这里解释

于 2013-09-20T05:50:20.793 回答