私は比較的 perl に慣れていないので、この質問が単純で、完全に明らかな何かが欠けている場合は事前に謝罪しますが、数日間答えを探していて、解決策を見つけることができません。
正規表現を使用して、A の後に C が続き、A と C の間に別の A がない FIRST インスタンスに一致させようとしています。 (特にADCに注意してください)ここにテキストがあります:
$text = "AAA ABC ADE AFG ADC AHI AJK AIZ XXB NBV";
私が最初に試した:
@finds1=$TEXT=~m/(A.*?C)/;
$result = $finds1[0];
print "result = $result\n";
これにより、次のように出力されます。
result = AAA ABC
私が欲しいのはちょうど:
result = ABC
B が任意の文字列である場合に使用できる正規表現を作成しようとしていることに注意してください。たとえば、ADC、AFGHJKC、AYUIOKJHGTC などです。
次に、if then else ステートメントと組み合わせたルックフォワードを使用しようとしました。コードは次のとおりです。
@finds1=$TEXT=~m/(A(?(?!.*?A.*?C).*?C|Z{100}))/;
$result = $finds1[0];
print "result = $result\n";
REGEX の最初の部分 (A は、perl に A の発生を見つけるように指示します。見つかったら、perl は if then else ステートメントを処理します。ここで、条件ステートメントは . ?Aのインスタンスがないことです。A に続く ?A 、何も見つからない場合、perl は .*?C を探し、少なくとも 1 つ見つかった場合、Z のインスタンスを 100 個検索します (このテキストでもテキスト I'解析しようとしている m は、100 個の Z があります。)
これは以下を返します:
result = ADC
初めて C を識別した後、肯定的な後読みの使用を検討しました。ただし、上で述べたように、最初の AC の組み合わせの間の文字数は、それらの間に A がなくても可変です。私の知る限り、PERL は可変長の後読みを行うことができません。
あなたが提供できる助けや方向性は大歓迎です!!
前もって感謝します!