我正在尝试在字符串中找到单个或组合在一起的单词。
例如:
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 :(得分: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}*)*
的总和。
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();
结果:This
,String That
,Here Is More
,Text
答案 1 :(得分:3)
答案 2 :(得分:3)