perl正则表达式,使用m!$ regex!与

时间:2011-01-16 03:54:35

标签: regex perl

源字符串:

  1. 普通话(11亿)
  2. 印地语/乌尔都语(3.5亿)
  3. 西班牙语(3.3亿)
  4. 英语(3亿)
  5. 阿拉伯语(2亿)
  6. 尝试仅提取语言名称。

    我目前使用此代码

     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 个答案:

答案 0 :(得分:6)

我不明白你在尝试使用quotemeta

如果你有真正的正则表达式语言,那么你想引用它。

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

如果你想引用它(你希望与字符串\s(..*)\(完全匹配),你不需要明确地quotemeta,但这实际上就是你现在所做的。

my $str = '\s(.*)\(';
if ($line =~ /\Q$str\E/) ...

答案 1 :(得分:2)

我同意@ephemient,这里不需要quotemeta。

我会使用/x修饰符来使regexp更具可读性:

  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))

一个有效,另一个无效。可能无法理解为什么!