стиль регулярных выражений perl, используя m! $ regex!против - PullRequest
1 голос
/ 16 января 2011

исходная строка:

  1. китайский (1,1 миллиарда)
  2. хинди / урду (350 миллионов)
  3. испанский (330 миллионов)
  4. Английский (300 миллионов)
  5. Арабский (200 миллионов)

Попытка извлечь только название языка.

У меня есть этот код, который работает

 if($line =~ m!\s(.*)\(!)
    {
      print $1 . "\n" ;
    }

Но я пытаюсь использовать для этого функцию quotemeta, которую я не могу сделать.

  my $regex = quotemeta( "\s(.*)\(" );
#Also tried as i suspect the \s is my problem.
  my $regex = quotemeta( "\\s(.*)\(" );


  if($line =~ m/$regex/)
    {
      print $1 . "\n" ;
    }

Какой стиль предпочтительнее другого?

Ответы [ 2 ]

6 голосов
/ 16 января 2011

Я не понимаю, что вы пытаетесь использовать quotemeta для.

Если у вас есть реальный язык регулярных выражений, то вы не хотите его процитировать.

my $regex = qr/\s(.*)\(/;
if ($line =~ /$regex/) ...

Если вы хотите заключить его в кавычки (вы хотите точно соответствовать строке \s(..*)\(), вам явно не нужно quotemeta, но это фактически то, что вы делаете сейчас.

my $str = '\s(.*)\(';
if ($line =~ /\Q$str\E/) ...
2 голосов
/ 16 января 2011

Я согласен с @ephemient, что quotemeta здесь не нужна.

Я бы использовал модификатор /x, чтобы сделать регулярное выражение более читабельным:

  if($line =~ m/ \s (.*) \( /x )

и шаг вперед

if($line =~ m/ 
    \s      # space
    (.*)    # capture  anything 
    \(      # up to and not including a (
  /x ) 

Уточнение. В настоящее время вы захватываете пространство после English. Я бы добавил

if($line =~ m/ 
    \s      # space
    (.*)    # capture  anythin 
    \s+    # up to and not including space
    \(      #  a (
  /x ) 

Наконец - посмотрите и посмотрите, что делает ваша программа, если вы дадите ей

1. English (GB) (300 million) 
2. Arabic (200 million (2005 value))

Один работает, другой нет. Возможно, не понятно почему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...