Regex perl正则表达式风格,使用m$雷格克斯!对

Regex perl正则表达式风格,使用m$雷格克斯!对,regex,perl,Regex,Perl,源字符串: 普通话(11亿) 印地语/乌尔都语(3.5亿) 西班牙文(3.3亿) 英语(3亿) 阿拉伯文(2亿) 正在尝试仅提取语言名称 我有这个代码,目前的工作 if($line =~ m!\s(.*)\(!) { print $1 . "\n" ; } 但是我正在尝试使用quotemeta函数来完成我似乎无法完成的任务 my $regex = quotemeta( "\s(.*)\(" ); #Also tried as i suspect the \s

源字符串:

  • 普通话(11亿)
  • 印地语/乌尔都语(3.5亿)
  • 西班牙文(3.3亿)
  • 英语(3亿)
  • 阿拉伯文(2亿)
  • 正在尝试仅提取语言名称

    我有这个代码,目前的工作

     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" ;
        }
    

    有哪种款式比另一种更受欢迎吗?

    我不明白你想用什么

    如果你有实际的正则表达式语言,那么你不想引用它

    my $regex = qr/\s(.*)\(/;
    if ($line =~ /$regex/) ...
    
    如果您确实想引用它(您想精确地匹配字符串
    \s(…*)\(
    ),您不需要显式地使用
    quotemeta
    ,但这实际上就是您现在正在做的事情

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

    我不明白你想用什么

    如果你有实际的正则表达式语言,那么你不想引用它

    my $regex = qr/\s(.*)\(/;
    if ($line =~ /$regex/) ...
    
    如果您确实想引用它(您想精确地匹配字符串
    \s(…*)\(
    ),您不需要显式地使用
    quotemeta
    ,但这实际上就是您现在正在做的事情

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

    我同意@ephemient的观点,这里不需要quotemeta

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

      if($line =~ m/ \s (.*) \( /x )
    
    更进一步

    if($line =~ m/ 
        \s      # space
        (.*)    # capture  anything 
        \(      # up to and not including a (
      /x ) 
    
    一种改进。目前您正在捕获
    英语之后的空间。我要添加

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

    一个有效,另一个无效。也许我们不明白为什么!

    我同意@ephemient的说法,这里不需要引用数据

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

      if($line =~ m/ \s (.*) \( /x )
    
    更进一步

    if($line =~ m/ 
        \s      # space
        (.*)    # capture  anything 
        \(      # up to and not including a (
      /x ) 
    
    一种改进。目前您正在捕获
    英语之后的空间。我要添加

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

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

    我不熟悉perl和regex,让我编辑我的问题我不熟悉perl和regex,让我编辑我的问题谢谢,我错了,我需要quotemeta函数来帮助我避开regex在perl中工作的特殊字符,因为从其他方面看,它会与我的regex中的括号混淆,qr//为我工作感谢Hanks,我错了,我需要quotemeta函数来帮助我避开正则表达式在perl中工作的特殊字符,因为从另一个角度看,它会与正则表达式中的括号混淆,qr//为我工作感谢那是“斜杠x”,而不是“反斜杠x”。这是贪婪与非贪婪的区别:)将(*)更改为(*),谢谢你的帮助!这是“斜杠x”,不是“反斜杠x”。这是贪婪与非贪婪的区别:)将(.*)更改为(.*),谢谢你的帮助!