C# 查找首字母大写且分组在一起的单词

C# 查找首字母大写且分组在一起的单词,c#,regex,C#,Regex,我试图在单个或组合在一起的字符串中查找单词 例如: 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个大写字母的单词?定义第二个模式并将其重复0或更多 @"\b[

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

例如:

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个大写字母的单词?

定义第二个模式并将其重复0或更多

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

对组使用
+
匹配多个事件

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

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

(\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个大写单词,没有前导/尾随空格

解释如下:

  • \b
    -单词边界(前面应该有一个非单词字符)
  • (?>\p{Lu}\p{M}*)(?>\p{L}\p{M}*)*
    -一个以大写字母开头的单词(后跟可选的变音符号),然后后跟任何(预合成的)Unicode字母
  • (?:\s+(?>\p{Lu}\p{M}*)(?>\p{L}\p{M}*){0,2}
    -2到0次
    • \s+
      -1个或多个空格(
      \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}*)*
的总和

:

var line=“这是一个字符串,这是我的示例,下面是更多的文本作为示例。”;
var模式=@“\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().Select(x=>x.Value).ToList();

结果:
字符串
此处有更多
文本

欢迎@KayNelson。如果您不想检查其他答案,这也会选择尾随空格。最好与ASCII输入一起使用,以防尾随空格不是问题。在.NET中的Regex支持Unicode,这就是为什么在回答时我认为您应该对完全支持Unicode感兴趣。不用说,在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();