4

誰かがこの正規表現で私を助けることができますか?最後に「Created」文字列を含まない行に一致する式が必要です。このスクリプトは、一部のソースコードの見出しを読み取るために使用されています。

$string = "* JAN-01-2001   bugsbunny     1234     Created Module";
#$string = "* DEC-12-2012   bugsbunny     5678     Modified Module";
if($string =~ /^\*\s+(\w\w\w-\d\d-\d\d\d\d)\s+(\w+)\s+(\d+)\s+(?!Created)/){
    print "$1\n$2\n$3\n$4\n";
} else {
    print "no match\n";
}

最初の$string定義を使用する場合、最後に「Created」という単語が含まれているため、一致が失敗する必要があります。2番目の$string定義を使用する場合、それは合格するはずであり、日付($ 1)、ユーザー($ 2)、変更番号($ 3)、および説明($ 4)を引き出す必要があります。

上記の式は機能していません。何かアドバイスはありますか?

4

4 に答える 4

4

選ぶ:

/^\*\s+(\w{3}-\d{2}-\d{4})\s+(\w+)\s+(\d+)\s+(?!.*Created)/

の前に、改行以外の文字をいくつでも許可する必要があります。Createdしたがって、.*

それ以外の場合、正規表現は、一致するときに1文字だけバックアップされる\s+ため、次のテキストは" Created"、になり、次に(?!Created)一致します。

ここでそれを参照してください; 試合が1スペース前に停止することに注意してCreatedください。

于 2013-02-05T07:59:25.433 に答える
1

この作業を行うために使用できるもう1つのトリックは、(?>...)バックトラックを無効にするグループを使用することです。バックトラックを無効にすると、+またはを使用する式*が見つかったものを貪欲に食い尽くし、パターンが失敗した場合に他の何かを試すために戻ることはありません。これは、「作成済み」の前の空白がすべて使い果たされることを意味します。したがって、(?!Created)正規表現の一部は常に正確な正しいポイントで発生します。

if($string =~ /^(?>\*\s+(\w\w\w-\d\d-\d\d\d\d)\s+(\w+)\s+(\d+)\s+)(?!Created)/){
    print "$1\n$2\n$3\n";
} else {
    print "no match\n";
}

これには、正規表現をはるかに高速にするという追加のボーナスもあります。

多くの正規表現は正しく一致するためにバックトラックできる必要があるため、このアプローチはすべての種類の問題に対して機能するわけではありません。しかし、これにはうまく機能します。

于 2013-02-05T10:44:07.573 に答える
0

もう1つのオプションはsplit、「作成済み」の説明をテストすることです。

use strict;
use warnings;

#my $string = "* JAN-01-2001   bugsbunny     1234     Created Module";
my $string = "* DEC-12-2012   bugsbunny     5678     Modified Module";

my ( undef, $date, $user, $change, $desc ) = split ' ', $string, 5;

if ( $desc !~ /^Created/ ) {
    print "$date\n$user\n$change\n$desc\n";
}
else {
    print "no match\n";
}

出力:

DEC-12-2012
bugsbunny
5678
Modified Module
于 2013-02-05T15:47:59.363 に答える
0
$string = "* JAN-02-2001   bugsbunny     1234     Created Module";
$string = "* DEC-12-2012   bugsbunny     5678     Modified Module";
if($string =~ /^\*\s+(\w\w\w-\d\d-\d\d\d\d)\s+(\w+)\s+(\d+)\s+([^Created]|Modified)\s+(\w+)/){
    print "$1\n$2\n$3\n$4\n";
}
else {
    print "no match\n";
}
于 2014-12-16T06:51:06.707 に答える