1

特定のプレフィックスがない場合、文字列内のすべての数字を「#」に置き換えようとしています。数字は、単語の一部として表示される場合もあれば、単独の単語として表示される場合もあります。

たとえば、プレフィックスとして ABC を使用すると、これが望ましい結果になります。

入力:

sdkfjsd 12312981 sdkfjsdfhbnmawd 1298 ,smdfsdnfk2342423 
sdlkfsdfs 20349 ABC1203912 2034234aac <-- ABC<number> stays, the other numbers do not
ABC1203912

結果 (2 行目と 3 行目に ABC と数字があることに注意してください):

sdkfjsd # sdkfjsdfhbnmawd # ,smdfsdnfk#
sdlkfsdfs # ABC1203912 #aac <-- ABC<number> stays, the other numbers do not
ABC1203912

私は regexp: の後ろに否定的な外観でそれをやろうとしましたs/(?<!ABC)\d+/#/g。この場合、ABC の後の最初の桁のみが置き換えられず、残りは置き換えられます。

私の次のステップは、文字列を を含む部分に分割ABC\d+し、他の部分で単純な置換を実行することです。

複数の文字列に分割せずに全体を行う方法についてのアドバイスをいただければ幸いです。

ありがとう!

編集 1: aac を適切な位置に戻しました。編集 2: 関連する場合に備えて、perl 5.8.5 を使用しています。私が制御していないコードとの互換性の問題により、新しいバージョンに更新できません。

4

3 に答える 3

3

「私の次のステップは、文字列を を含む部分に分割ABC\d+し、他の部分で単純な置換を実行することです。」の意味がわかりませんが、ここでの主な問題ではないようです。そうでなければ教えてください。

キーワードが前に付いていないすべての数字と一致させるにはABC、次の正規表現を使用できます。

(?<!ABC|\d)\d+

これにより、そのABC前に数字がある場合、または別の数字がある場合はその数字の一致が防止されます (したがって\d+、数字の途中から開始した場合の一致が防止されます。

正規表現101のデモ

質問の文字列の 2 つの部分が移動したことに注意してください。私はあなたが使用した入力のみを取っています。


上記が機能しない場合 (たとえば、正規表現エンジンが、後読みのパターンを可変幅にすることはできない、またはこれらの行に沿ったものにすることはできないと言っている)、代替の同等のものは次のとおりです。

(?<!ABC)(?<!\d)\d+

正規表現101のデモ

于 2014-03-30T11:02:16.507 に答える
0

「ゼロ幅の負の後読みアサーション」を使用する必要があります。何かが直前にない場合にのみ一致します。

例えば。が前に付いていない数字に一致するABC:

(?<!ABC)\d

すでにここまで来ましたが、次のステップはプレフィックスと複数の数字を照合することです。

(?<!ABC)\d+

一致する必要がないため、直接は役に立ちません。

したがって、質問を少し言い換えてください。

プレフィックスの後にない数字と 1 つ以上の数字を置き換えます

すなわち。"ABC123" では、1、2、または 3 を置き換えたくありません。また、ゼロ幅の負の後読みアサーションを拡張して、数字を含めることができます。

(?<!ABC\d+)\d

したがって、プレフィックスに続く数字も除外します。

注意: これは、Perl が可変幅の後読みをサポートしていることを前提としています: 確かに、後読みを含む正規表現の最初の拡張は固定幅でなければなりませんでしたが、Perl 正規表現を真剣に使用してからしばらく経っているので、Perl 正規表現の実装が次のように拡張されたと仮定しています他のプラットフォームと一致します。

編集: おっと、s/positive/negative/ 後読み。

于 2014-03-30T10:40:55.567 に答える