ここでこの質問の過度に単純化されたバージョンを手伝ってくれた@cool_me5000に感謝します:PERL:文字列で最初のトークンが繰り返されることなく文字列を照合するためにREGEXを使用します。(AAA ABCではなくABC)
調整された質問は次のとおりです。
正規表現を使用して、ATEとCATの間に別のATEがない状態でATEの後にCATが続く最初のインスタンスに一致させようとしています。「ATEBATCAT」に合わせたいです。このテキスト文字列には、最初のATE / CATの組み合わせに続いて、ATE / CATにも適合する可能性のある他のインスタンスがあることに注意してください(特に、文字列の終わり近くにある「ATE DOGCAT」に注意してください)。テキストは次のとおりです。
$TEXT = "ATE ATE ATE ATE BAT CAT ATE DOG EGG ATE FOR GIN ATE DOG CAT ATE";
私が最初に試した:
@finds1=$TEXT=~m/((ATE).*?(CAT))/;
$result = $finds1[0];
print "result = $result\n";
これにより、次のように出力されます。
result = ATE ATE ATE ATE BAT CAT
私が欲しいのはただ:
result = ATE BAT CAT
Bが任意の文字列である場合に使用できる正規表現を作成しようとしていることに注意してください。たとえば、ATE DOG CAT、ATE FAT GET HAT JOT KIN CAT、ATE YAK ULE INN OLD KOC JOG HUG GOTTALCAT。
次に、ifthenelseステートメントと組み合わせたルックフォワードを使用しようとしました。コードは次のとおりです。
@finds1=$TEXT=~m/(ATE(?(?!.*?ATE.*?CAT).*?CAT|Z{100}))/;
$result = $finds1[0];
print "result = $result\n";
正規表現の最初の部分(ATEは、PERlにATEの発生を検出するように指示します。検出されると、perlはif then elseステートメントを処理します。条件ステートメントでは、ATEの後に。?ATE。?CATのインスタンスはありません。 、何も見つからない場合、perlは。*?CATを検索し、少なくとも1つが見つかった場合、Zの100個のインスタンスを検索します(このテキストでもテキストでもないので、Perlを先に進める方法'解析しようとしているmは100Zあります。)
これは次を返します:
result = ATE DOG CAT
CATを初めて特定した後、前向きな後読みを使用することを検討しました。ただし、前述のように、最初のATE.CATの組み合わせの間にAがない場合の文字数は可変です。私の知る限り、PERLは可変長のルックビハインドを実行できません。
あなたが提供できるどんな助けや指示も大歓迎です!!
前もって感謝します!