2011-06-25 7 views
1

私はinclude =を検索し、 '='の後にパス全体を取得する必要があるテキスト/コードのブロックを持っています。perlと正規表現でパスを抽出する

<item name="Post Include Code"> 
<value> 
First section of content 

include=Y:\default\main\tsconfig\tsconfig\custom\inline\callouts\search\results.tpl 
Second section of content 
</value> 

</item> 

コード:

if ($includeText=~ s/include=(.*)$/\1/) { 
    print "$1"; 
} 
else { 
    print "no path"; 
} 
include=Y:\default\main\tsconfig\custom\inline\callouts\search\results. 

が、これは検索されているXMLであると仮定します。私は、コード/テキストのチャンクに探しているものを手に入れます私はY:\default\main\tsconfig\custom\inline\callouts\search\results.tplになりたいので、テンプレートを含めることができます。テキスト/コードは別のファイルから取得されます。

ありがとうございます!

答えて

-3

"include ="部分は含めたくありません。ちょうど後のことが欲しいので、 "include ="部分を[^include=].*(テキストエディタのテキストが私のために働いた)のようなもので除外しなければなりません。

+1

そして、 'include = c:\ foo'と言うとどうなりますか?あなたの正規表現は 'c'を捕まえません。 – cjm

+0

これを別の回答にコメントとして書き込むことを意図したのでしょうか?それは私に完全な答えのようには見えません。 – TLP

+0

あなたのコードは[^ = cdeilnu]とまったく同じです。*正しいことをするつもりだと思いますか? – tadmc

2

私はあなたのスクリプトとその作業中に小さな変更を加えた:

$include = "include=Y:\\default\\main\\tsconfig\\custom\\inline\\callouts\\search\\results."; 


if ($include =~ m/include=(.*)$/) { 
    print "$1"; 
} 
else { 
    print "no path"; 
} 
+0

それを含むことを除いても。彼は等号の直後に欲しいので、その部分を除外するためには '[include =]'が必要になります。 – John

+1

@Mike - "include"はキャプチャグループに含まれていないので、 '$ 1'で返されません。 –

+0

私は彼が入力テキストを変更できないと思っていますが、それを抽出する正規表現を探しています。 – TLP

-4

// EDIT: は、いくつかの例を見て後に修正 これが動作しているようですが、これはRaghuramのポストと同じです。

if($includeText =~ m/include=(.*)$/){ 
        print "$1"; 
        } 
        else { 
         print "no path"; 
        } 
+2

'=〜'は正規表現関数を適用する正しい演算子です –

+0

これは間違っています。 1. '=='は数値の比較に使用され、テキストの比較には使用されません( 'eq'を使用します)。 2.これは '$ _'の代入を実行し、数値結果(つまり一致の数)を' $ includeText'と比較します。 –

+0

@Nathan、そうですね... 私はちょうどその点を見逃しました。演算子eqは –

1

申し訳ありませんが、私はあなたのスクリプトを使用し、それを使用し、それはうまく動作します。あなたの正規表現には何も問題はありませんが、表示されていない他のコードがあります。

また、あなたの問題が何であるかについてもう少し詳しく知ることができます。 "私はちょうど得ることができない.."本当に何がうまくいかないのか私たちにはあまり言いません。

use strict; 
use warnings; 

そして、あなたはそのためのような愚かな何かを行っていること:このスクリプトは動作します

while ($includetext = <DATA>) { 
    if ($includeText =~ s/...) 

を:

マイ推測は、あなたが使用していないということです

use warnings; 
use strict; 

while (<DATA>) { 
    if (s/include=(.*)$/$1/) { 
      print "$1"; 
    } 
    else { 
      print "no path"; 
    } 
} 

__DATA__ 
include=Y:\default\main\tsconfig\custom\inline\callouts\search\results. 
+0

それは本当に一言でコードです。私は、XMLのファイルからテキストの塊をつかむデータ部分を単純化しました。私はちょうどあなたがなぜそれがうまくいかないのと同じように混乱しています。 –

+0

データにインクルード+をチェックした後に追加してみましょう。調べる唯一のテキストではないため、検索対象のコンテンツに空白や改行がある可能性があるため、動作しないと仮定しています。私はあなたが提案した "s/include =(。*)$/$ 1 /"のやり方でこの作業が何になるのだろうかと思っています。それは明らかな選択肢とクリーナーのように思えた –

0

これはあなたが探しているものだと思います

#!/usr/bin/perl 
use strict; 
use diagnostics; 
my $inc='include=Y:\default\main\tsconfig\custom\inline\callouts\search\results.tpl'; 
if ($inc =~ m{include=([\w\:\\\w /]+\w+\.\w+)}) 
{ 
print $1; 
} 
else 
{ 
print "no path"; 
} 
+1

これはある程度動作します。評価される文字列は、include =を検索するコンテンツ領域であり、このコンテンツ領域に空白や改行がある可能性があります。パスの後に表示されるコンテンツも画面に印刷されます。 たちはxmlファイルから、次を使用していると仮定します。コンテンツ の 最初のセクション <項目名= "郵便番号を含める"> = Yを含める:メイン\ TSconfigの\のTSconfig \カスタム\ \デフォルトを\インライン\コールアウト\検索\結果.tpl コンテンツの第2セクション