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
-一个以大写字母开头的单词(后跟可选的变音符号),然后后跟任何(预合成的)Unicode字母(?>\p{Lu}\p{M}*)(?>\p{L}\p{M}*)*
-2到0次(?:\s+(?>\p{Lu}\p{M}*)(?>\p{L}\p{M}*){0,2}
-1个或多个空格(\s+
),后跟\s+
-由Unicode字母组成的单词(可能带有变音符号)(?>\p{Lu}\p{M}*)(?>\p{L}\p{M}*)*
\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();