2011-06-25 74 views
1

我有一段文本/代碼,我需要搜索include =然後在'='後面抓取整個路徑我已經嘗試了幾種方法,而我無法看到要得到什麼,我在代碼/文本塊尋找:perl和正則表達式來提取路徑

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

認爲這是被搜索的XML:

<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"; 
} 

我想結束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

//編輯: 修正找幾個例子後 這似乎是工作,這是一樣的拉古拉姆的帖子。

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:\ DEFAULT \主\ tsconfig \ tsconfig \定製\ inline \ callouts \ search \ results.tpl 第二部分內容