如何使用正则表达式将两个大写字母匹配在一起,前面没有特殊字符?

时间:2015-12-29 20:08:00

标签: c# regex string special-characters

我最近阅读了许多关于正则表达式的非常有趣的内容。特别是关于creating your own regex boundaries

我认为我没见过的一件事(我100%已经完成,但我没有注意到任何例子)是如何排除正则表达式匹配,如果它之前是'特殊的字符',例如& ! %$#。例如:

如果我使用正则表达式(注意这是来自C#)

([A-Z]{2,}\\b)

它将匹配长度为两个或更多的任何大写字母,并使用\b边界确保两个大写字母不以任何其他字母开头或结尾。但是这里我不确定这会如何表现:

AA -Match

sAB - 不匹配

AC - 没有匹配

!AD -Match

AF!的 - 匹配

我想知道如何只选择两个或多个不带小写字母/数字/符号的大写字母,或者后跟小写字母/数字/特殊字符。

我见过人们使用空格,所以要确保字符串以空格开头或以空格结尾,但如果它位于一行的开头或结尾,则不起作用。

所以,我从上面的例子中寻找的输出是:

AA -Match

sAB - 不匹配

AC - 没有匹配

!AD - 没有匹配

AF! - 没有匹配

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

你只需要使用lookbehind和lookahead:

(?<![a-z\d!@#$%^&*()])[A-Z]{2,}(?![a-z\d!@#$%^&*()])

请参阅regex demo

(?<![a-z\d!@#$%^&*()]) lookbehind确保没有小写字母([a-z]),数字(\d)或您定义的特殊字符。如果有,则匹配失败,不返回任何内容。

如果在ALLCAPS字母后找到相同的字符,(?![a-z\d!@#$%^&*()])前瞻也会失败。

详情请见Lookahead and Lookbehind Zero-Length Assertions here

答案 1 :(得分:1)

我认为只要在你所拥有的模式之前加上小写字母的否定以及你要排除的任何符号就足够了。我的示例仅排除了!,但您可以根据需要添加到列表中。括号内的^否定了它们内部的内容。因此,例如,您可以合并模式

/[^a-z!][A-Z]{2,}[^a-z!]/g