查找包含大写第一个字母的单词

时间:2015-11-25 10:33:48

标签: 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个单词,用大写字母

3 个答案:

答案 0 :(得分:4)

真正的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 demo

以下是解释:

  • \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# code

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

答案 1 :(得分:3)

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

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

DEMO

答案 2 :(得分:3)

在论坛上使用+来匹配多个匹配项。

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

Demo

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

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

Demo