1

私は比較的 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 は可変長の後読みを行うことができません。

あなたが提供できる助けや方向性は大歓迎です!!

前もって感謝します!

4

2 に答える 2

3

あなたはただ望んでいませんか

/A[^AC]*C/
于 2012-07-04T00:39:06.353 に答える
0

私が知る限り、あなたは次のことを望んでいます:

  • 「あ」
  • A 以外の任意の数の文字が続く
  • 続いて「C」

これは正規表現で実現できます

/A[B-Z]*?C/

角括弧内[]の文字は文字クラスを表します。文字クラスを使用すると、複数の文字のうちの 1 つだけに一致するように正規表現エンジンに指示できます。一致させたい文字 (または文字の範囲) を角かっこ ( http://www.regular-expressions.info/charclass.html ) の間に配置するだけです。これを別の文字 Q で実行したいとします。文字クラスはわずかに異なります。

/Q[A-PR-Z]*?C/

A と C の間のスペースに対応するように変更したい場合は、2 つの異なる方法でアプローチできます。文字クラスを否定することができ、次のように、そのクラス以外の任意の文字と一致します。

/A[^AC]*C/

これは、A、次に A と C 以外の任意の数の文字、次に C に一致します。

または、次のように、元の文字クラスにスペースを追加できます。

/A[B-Z ]*?C/(Z の後のスペースに注意してください)

任意の種類の空白が必要な場合は、空白を次のように表す \s に置き換えます。

/A[B-Z\s]*?C/

于 2012-07-04T00:03:01.113 に答える