如何在perl中使用正则表达式截断字符串

时间:2010-08-03 19:25:20

标签: regex perl

我在文件中有以下字符串,并希望将字符串截断为不超过6个字符。如何在perl中使用正则表达式? 原始文件是:

cat shortstring.in:

<value>1234@google.com</value>
<value>1235@google.com</value>

我想把文件作为:
cat shortstring.out

<value>1234@g</value>
<value>1235@g</value>

我有一个如下代码,有没有比使用更有效的方法 s/<value>(\w\w\w\w\w\w)(.*)/$1/;

以下是我的代码的一部分:

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

5 个答案:

答案 0 :(得分:10)

使用它(正则表达式不是Perl的唯一功能,它对此有点过分了:: - )

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

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

答案 1 :(得分:5)

$ perl -pe 's/(<value>[^<]{1,6})[^<]*/$1/' shortstring.in
<value>1234@g</value>
<value>1235@g</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 $_;
}

使用bang作为替换运算符的分隔符会阻止</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>1234@google.com</value>
<value>1235@google.com</value>
<value>12@google.com</value>

输出:

$ ./prog.pl 
<value>1234@g</value>
<value>1235@g</value>
<value>12@goo</value>

答案 2 :(得分:1)

您希望截断标记内的文本,该文本可能已短于6个字符,在这种情况下:

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

答案 3 :(得分:1)

试试这个:

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

答案 4 :(得分:0)

s/<value>(.{1,6}).*/<value>$1</value>/;