как обрезать строку с помощью регулярного выражения в Perl - PullRequest
0 голосов
/ 03 августа 2010

У меня есть следующая строка в файле и я хочу обрезать строку до 6 символов.Как это сделать с помощью регулярного выражения в Perl?
оригинальный файл:

cat shortstring.in:

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

Я хочу получить файл:
cat shortstring.out

<value>1234@g</value><br> <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 ]

10 голосов
/ 03 августа 2010

Используйте это вместо этого (регулярное выражение не единственная особенность Perl, и это излишне для этого: -)

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

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

5 голосов
/ 03 августа 2010
$ 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 $_;
}

Использование взрыва в качестве разделителя в операторе подстановки предотвращает Синдром склонности зубочистки в </value>.

ПРИМЕЧАНИЕ: Применяются обычные предупреждения о «разборе» 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>
1 голос
/ 03 августа 2010

Попробуйте это:

s|(?<=<value>)(.*?)(?=</value>)|substr $1,0,6|e;
1 голос
/ 03 августа 2010

Похоже, вы хотите обрезать текст внутри тега, который уже может быть короче 6 символов, в этом случае:

s/(<value>[^<]{1,6})[^<]*/$1/
0 голосов
/ 03 августа 2010
s/<value>(.{1,6}).*/<value>$1</value>/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...