2文字の間の文字列を抽出するにはどうすればよいですか。

perl
2文字の間の文字列を抽出するにはどうすればよいですか。

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

123 + FOO1[ccc + e_FOO1 + ddd + FOO2[b_FOO2]] = 123

今、私は FOO1`が e_`と共に表示されていることを確認する必要があります。 つまり、このような状況はあり得ません。

123 + FOO1[ccc + e_FOK1 ...]

私の簡単な質問は、たとえばFOO1という語をキャッチするようにPerlに指示する方法を教えてください。

2つの文字の間で検索することを考えました: " "`と `" ["

そしてそれが例えば `” [..] “`の間の `” e_ “`の後に正しく書かれているかどうかをチェックします。

それをどのようにして回収できますか?

  0  0


ベストアンサー

あなたはあなたのミニ言語用のパーサーを書く必要があります。 calculatorデモは良い出発点となるでしょう。

#!/ usr / bin / perl

厳密を使用してください。警告を使用します。

my($ expr)= @ARGV;

my @tokens = split //、$ expr;

my($ word、$ inside)=(q {}、0);

私の$ token(@tokens){$ token =〜/ \ A \ w \ z /に対して、{$ word。= $ token;次 };

if($ inside){if($ word =〜/ FOO1 /){$ word eq 'e_FOO1'または死ぬ "No FOO1 w / o e_接頭辞は使えません! "FOO1は許可されていません!\ n"; }

$ token eq '['と$ inside。 $ token eq ']'および -  $ inside。 $ word = ''; }
C:\ Temp> t.pl "123 MOO1 [CCC e_FOO1 ddd FOO2 [b_FOO2]] = 123"
C:\ Temp> t.pl "123 FOO1 [ccc e_FOO1 ddd FOO2 [b_FOO2]] = 123" FOO1は使用できません。
C:\ Temp> t.pl "123 MOO1 [ccc FOO1 ddd FOO2 [b_FOO2]] = 123" FOO1がありません。

2


あなたのコメントに基づいて、あなたの質問は「[]と[]]の間にあると仮定します。 ‘e_’記号は ‘e_FOO’で、他のものではないことを確認してください。

(編集:大丈夫、角括弧の直前にも “FOO”キーワードが必要なようです。 それに応じて正規表現を修正します。)

if($ line =〜/([AZ])#すべての大文字のキーワードに一致し、後で保存するために保存します。(\ 1または$ 1で検索できます)\ [#最初の[[\]] *に一致します。 ] e_#a haではない任意の数の文字、これは私たちのe_ \ 1#、これは以前に一致したキーワードです[*]] *#これ以外のいくつかの文字は] \]#ここで私たちの閉じる] / x){「良いデータ」と言う。 } else {「悪いデータ」と言う。 }

しかし、どうぞ、 perldoc perlreにあるチュートリアルのいくつかを読んでください。

1


あなたの状況があなたが説明したよりも複雑であれば、このコードは機能しません(例えば、それはあなたの左右の括弧が互いにバランスをとることを確実にするために何もしません)。 しかし、コードは逆参照(下記の `\ 1`を参照)の使い方を説明しています。

use strict;
use warnings;

while (){
    warn "Bad line: $_" unless / (\w+) \[ .* e_\1 .* \] /x;
}

__DATA__
123 + FOO1[ccc + e_FOO1 + ddd + FOO2[b_FOO2]] = 123
123 + FOO1[ccc + e_FOOx + ddd + FOO2[b_FOO2]] = 123

0


「FOO1の後ろに「e_」という文字列が続くことを確認する必要があることを確認する必要があります」と言ったので、e_FOO1をチェックするだけでいいのですか? あまりにも複雑な正規表現は必要ありません。

my $ str = "123 FOO1 [ccc e_FOO1 ddd FOO2 [b_FOO2]] = 123"; my $ s = index($ str、 "["); my $ e = index($ str、 "]"); my $ f = index($ str、 "e_FOO1"); if($ f> = $ sかつ$ f <= $ e){print "found \ n"; }

0


タイトルとURLをコピーしました