正则表达式匹配除特定字符串之外的任何大写字符

时间:2009-11-03 13:05:55

标签: regex

我希望匹配所有包含任何大写字符的行,但忽略字符串 A _

要添加到复杂功能中,我想忽略不同字符串之后的所有内容,例如:公开评论

以下是应该和不应该匹配的示例

匹配

  • foobar的
  • foo Bar foo
  • A_fooBar
  • fooBar / *评论* /

不匹配(C_不应触发匹配)

  • A_foobar
  • foo A_bar
  • foobar的
  • foo bar foo bar
  • foobar / *评论* /

谢谢:)

6 个答案:

答案 0 :(得分:4)

这应该(也?)这样做:

(?!A_)[A-Z](?!((?!/\*).)*\*/)

一个简短的解释:

(?!A_)[A-Z]     # if no 'A_' can be seen, match any uppercase letter
(?!             # start negative look ahead
  ((?!/\*).)    #   if no '/*' can be seen, match any character (except line breaks)
  *             #   match zero or more of the previous match
  \*/           #   match '*/'
)               # end negative look ahead

所以,用简单的英语:

  

匹配除“A_”之外的任何大写,如果在没有遇到'/*'的情况下可以看到'* /',也不匹配大写。

答案 1 :(得分:1)

尝试:

(?<!A_)[a-zA-Z]+

(?!...)被称为negative lookbehind

至于你的具体问题,这是一种欺骗,但尝试:

^([#\.]|(?<!A_))[A-Za-z]{2,}

我明白了:

fooBar => fooBar
foo Bar foo => foo
A_fooBar (no match)
fooBar /* Comment */ => fooBar
A_foobar (no match)
foo A_bar => foo
foobar => foobar
foo bar foo bar => foo
foobar /* Comment */ => foobar

答案 2 :(得分:1)

我的回答:

/([B-Z]|A[^_]|A$)/

如果可能的话,我会在较早阶段删除评论。

测试:

#!perl
use warnings;
use strict;

my @matches = (
"fooBar",
"foo Bar foo",
"A_fooBar",
"fooBar /* Comment */");

my @nomatches = (
"A_foobar",
"foo A_bar",
"foobar",
"foo bar foo bar",
"foobar /* Comment */");

my $regex = qr/([B-Z]|A[^_]|A$)/;

for my $m (@matches) {
    $m =~ s:/\*.*$::;
    die "FAIL $m" unless $m =~ $regex;
}
for my $m (@nomatches) {
    $m =~ s:/\*.*$::;
    die "FAIL $m" unless $m !~ $regex;
}

试一试:http://codepad.org/EJhWtqkP

答案 3 :(得分:0)

虽然评论处理不是非常强大,但是这样做了。 (它假定评论始终位于该行的末尾。)

.*((A(?!_)|([B-Z]))(?<!/\*.*)).*\r\n

答案 4 :(得分:0)

它必须是一个正则表达式吗?在perl中,您可以执行以下操作:

if($ string =〜/ [A-Z] /&amp;&amp; $ string!〜/ A _ /)

它不像一个带有回顾的单个表达式那么酷,但它可能更容易阅读和维护。

答案 5 :(得分:0)

试试这个:

^(?:[^A-Z/]|A_|/(?!\*))*+[A-Z]

这适用于任何支持占有量词的风格,例如: PowerGrep,Java和PHP。 .NET风味没有,但它确实支持原子组:

^(?>(?:[^A-Z/]|A_|/(?!\*))*)[A-Z]

如果这些功能都不可用,您可以使用另一个前瞻来防止它与反弹上的A_匹配:

^(?:[^A-Z/]|A_|/(?!\*))*(?!A_)[A-Z]