我希望匹配所有包含任何大写字符的行,但忽略字符串 A _
要添加到复杂功能中,我想忽略不同字符串之后的所有内容,例如:公开评论
以下是应该和不应该匹配的示例
匹配
不匹配(C_不应触发匹配)
谢谢:)
答案 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;
}
答案 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]