1

私はこの文字列を持っています

asp.net somedomain.com

特定の場合を除いて、ドメイン ドット拡張部分のみを取り除く必要があります。だから私はこれが欲しい:

asp.net somedomain

vb.net、asp.netなどがあるときはいつでも。拡張子を取り除きたくありません。

これをperlで試しましたが、効果はありませんでした。

$company =~ s/(?=\w+)(?!=asp|vb|c#)\.[a-zA-Z]{2,6}\b/\1/g;

asp私のロジックは、ドットがorではなく 1 つ以上のアルファである必要がある前のものvbですc#

4

2 に答える 2

3

NegativeLookBehindを使用できます。あなたはほとんどそこにいましたが、LookAheadsを使用しています。

RegExp:(?<!asp|vb|c\#)\.[a-zA-Z]{2,6}\b 何も置き換えない

ここでデモの説明:http://regex101.com/r/tG5rO1

可変長の正規表現エラーを回避するには、次を使用します。(?<!asp)(?<!vb|c\#)\.[a-z]{2,6}\b
編集:異なる長さの除外された単語のLookBehindグループを分離します

これは、基準に一致しないTLDのみを検索します。

アップデート:

特殊なケースに対処するには:除外された単語で終わる単語と一致させず、除外された単語の任意の組み合わせと一致させます(例vB VB vb Vb) 。

RegExp:\b(?<!\b[aA][sS][pP])(?<!\b[vV][bB]|\b[cC]\#)\.[a-zA-Z]{2,6}\b 説明されたデモ: http: //regex101.com/r/bR3kJ8

または:RegEx修飾子i\b(?<!\basp)(?<!\bvb|\bc\#)\.[a-z]{2,6}\b
と一緒 に使用する場合case insensitive

アップデート#2

.netTLDと除外された単語のみを考慮しているため、より安全です。

/(^|\s)(?!(?:visual)?(?:basic|studio|asp|v[bs]|c\#)\.net)(\w+)(?:\.com?\.[a-z]{2}|\.[a-z]{2,6})\b/\1\2/gi

以前のバリアントとは対照的に、交換が必要です。

説明されたデモ: http: //regex101.com/r/kL5mQ5

于 2013-03-22T19:03:35.217 に答える
1

最後のものとちょうど一致します:

my $s = q{asp.net somedomain.com};
my ($company) = ($s =~ / ([A-Za-z]{2,}) [.] (?:[A-Za-z]{2,}) \z /x);
print $company, "\n";

または、splitスペースとドットで:

my $s = q{asp.net somedomain.com};
my ($company) = split /[.]/, (split ' ', $s)[-1];
print $company, "\n";

パターンにどの程度の作業を加えたいかは、入力にどの程度の変動があるかによって異なります。上記の例は、提供されたサンプル入力に基づいています。

于 2013-03-22T19:02:14.323 に答える