查找首字母大写的单词,这些单词组合在一起

本文关键字:单词 组合 在一起 查找 | 更新日期: 2023-09-27 18:24:12

我试图在单个或组合在一起的字符串中查找单词。

例如:

This is a String That is my example, Here Is More text as example.

我想退出,所以我的结果如下。

This
String That
Here Is More

到目前为止,我的正则表达式是这个

('b[A-Z][a-z]*'s'b)

这会发现大写的单词,但只会将包含空格的单词单独分组。如何控制正则表达式以连续接受1到3个大写字母的单词?

查找首字母大写的单词,这些单词组合在一起

一个真正支持Unicode的解决方案是
'b(?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*(?:'s+(?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*){0,2}'b

它只匹配一行中1-3个大写单词,没有前导/尾随空格。

参见regex演示

以下是解释:

  • 'b-单词边界(前面应该有一个非单词字符)
  • (?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*-一个以大写字母开头的单词(后面跟着可选的变音符号),然后跟着任何(也是预合成的)Unicode字母
  • (?:'s+(?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*){0,2}-出现2到0次
    • 's+-一个或多个空白('s+),后面跟
    • (?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*-一个由Unicode字母组成的单词(可能带有变音符号)

'p{Lu}匹配大写Unicode字母。'p{M}匹配变音符号。因此,要匹配大写的Unicode字母,请使用原子组(?>'p{Lu}'p{M}*)'p{L}匹配任何基本Unicode字母。所以,一个单词将是子模式(?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*的总和。

C#代码:

var line = "This is a String That is my example, Here Is More Text as example.";
var pattern = @"'b(?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*(?:'s+(?>'p{Lu}'p{M}*)(?>'p{L}'p{M}*)*){0,2}'b";
var result = Regex.Matches(line, pattern).Cast<Match>().Select(x => x.Value).ToList();

结果:ThisString ThatHere Is MoreText

在组中使用+匹配多个匹配项。

('b[A-Z][a-z]*'s'b)+

演示

使用{1,3}匹配一组、两组或三组中的单词。

('b[A-Z][a-z]*'s'b){1,3}

演示

定义第二个模式并重复零个或更多。。

@"'b[A-Z][a-z]*(?:'s[A-Z][a-z]*)*'b"

演示