2010-08-03 31 views
0

我在文件中有以下字符串,並且要將字符串截斷爲不超過6個字符。如何在perl中使用正則表達式?
原始文件是:如何在perl中使用正則表達式截斷字符串

貓shortstring.in:

<value>[email protected]</value>
<value>[email protected]</value>

我想獲得文件:
貓shortstring.out

<value>[email protected]</value>
<value>[email protected]</value>

我有一個代碼下面有沒有比使用
s/<value>(\w\w\w\w\w\w)(.*)/$1/;更有效的方法?

這裏是我的代碼的一部分:

while (<$input_handle>) {      # take one input line at a time 
      chomp; 
      if (/(\[email protected])/) { 
        s/(<value>\w\w\w\w\w\w)(.*)</value>/$1/; 
        print $output_handle "$_\n"; 
       } else { 
       print $output_handle "$_\n"; 
      } 
    } 
+1

@是不發一語字符等等\ w不匹配。另外,我認爲你不是要刪除''部分? – ysth 2010-08-03 19:28:28

回答

5
$ perl -pe 's/(<value>[^<]{1,6})[^<]*/$1/' shortstring.in 
<value>[email protected]</value> 
<value>[email protected]</value>

在從你的問題的片斷的情況下,使用

while (<$input_handle>) { 
    s!(<value>)(.*?)(</value>)!$1 . substr($2,0,6) . $3!e 
    if /(\d+\@google\.com)/; 
    print $output_handle $_; 
} 

或用一個模式去做

while (<$input_handle>) { 
    s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e; 
    print $output_handle $_; 
} 

將劉海作爲分隔符e替代運算符在</value>中阻止Leaning Toothpick Syndrome

注意:通常的warnings關於「解析」正則表達式的XML適用。

演示程序:

#! /usr/bin/perl 

use warnings; 
use strict; 

my $input_handle = \*DATA; 
open my $output_handle, ">&=", \*STDOUT or die "$0: open: $!"; 

while (<$input_handle>) { 
    s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e; 
    print $output_handle $_; 
} 

__DATA__ 
<value>[email protected]</value> 
<value>[email protected]</value> 
<value>[email protected]</value> 

輸出:

$ ./prog.pl 
<value>[email protected]</value> 
<value>[email protected]</value> 
<value>[email protected]</value>
+0

我覺得我的代碼不正確,我只想截取 user399517 2010-08-03 19:30:41

+2

之間的數據爲什麼你認爲它不正確? – 2010-08-03 19:31:45

+0

你不工作。最後我用這個:s /(。{1,$ truncate_num})。*(<。*)/ $ 1 $ 2 /; – user399517 2010-08-04 00:07:25

1

看起來要截斷標籤內的文本可能是已經短於6個字符,在這種情況下:

s/(<value>[^<]{1,6})[^<]*/$1/ 
0
s/<value>(.{1,6}).*/<value>$1</value>/; 
+0

與。在(。{1,6})中,您可以獲得諸如'123 2010-08-03 19:49:14

+0

@David之類的東西,不,因爲他已經過測試,以確保該標記具有「@ google.com」,因此它不能更小比起那個來說。如果你想要更加小心,你可以測試結束標記,但是由於在正則表達式中解析xml或html是一個真正不好的想法,我不想給他任何想法。 – 2010-08-03 20:37:30

10

用此代替(正則表達式是不是Perl的唯一的功能,它是矯枉過正這一點::-)

$str = substr($str, 0, 6); 

http://perldoc.perl.org/functions/substr.html

+1

+1提醒我,正則表達式不是Perl的唯一功能.-) – 2012-03-06 22:17:38

1

試試這個:

s|(?<=<value>)(.*?)(?=</value>)|substr $1,0,6|e; 
相關問題