[英]Regex to detect if words are part of the string and next word is not capitalized
我正在寻找一个正则表达式,它可以匹配作为给定字符串一部分的特定单词或带有限制的单词 - 如果在模式之后有一个单词,则该单词不应大写。 假设这些词是“基本情况”,所以这里有一些例子
Final Base Case
- 应该匹配Final Base Case financial
- 应该匹配Final Base Case Financial
- 不应匹配(下一个单词“Financial”大写)Final Base Cases
- 不应匹配(“案例”和“案例”不匹配)我使用以下正则表达式来确定我的单词/单词是否是字符串的一部分
\bBase Case(?!\w)
有人可以帮我修改我的正则表达式以添加对下一个大写单词的限制吗?
您需要在搜索模式之后检查两种情况:
$
); 或者\s+[^AZ\s]
)你可以用这个正则表达式做到这一点:
\bBase Case(?=$|\s+[^A-Z\s])
请注意,由于前瞻的后半部分在下一个单词之前声明了一个空格,因此它会阻止Base Cases
或类似的匹配。
在最一般的情况下,您可以使用
\bBase\s+Case\b(?!\W*\p{Lu})
请参阅正则表达式演示。
细节
\b
- 单词边界Base\s+Case
- Base
, 1+ 空格, Case
\b
- 单词边界(?!\W*\p{Lu})
- 如果有 0 个或多个非单词字符后跟紧跟当前位置右侧的任何 Unicode 大写字母,则匹配失败。 如果单词和大写字母之间只有空格,请将\W
替换为\s
。
C# 用法:
var results = Regex.Matches(text, @"\bBase\s+Case\b(?!\W*\p{Lu})")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
或者,只是检查它是否存在于每个字符串中:
var texts = new List<string> {"Final Base Case", "Final Base Case financial", "Final Base Case Financial", "Final Base Cases"};
foreach (var text in texts) {
Console.WriteLine("{0}: {1}", text, Regex.IsMatch(text, @"\bBase\s+Case\b(?!\W*\p{Lu})"));
}
请参阅C# 演示。 Output:
Final Base Case: True
Final Base Case financial: True
Final Base Case Financial: False
Final Base Cases: False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.