【问题标题】:Regular Expression - Perl正则表达式 - Perl
【发布时间】:2014-12-30 05:21:36
【问题描述】:

我正在尝试使用正则表达式从字符串中获取子字符串,但由于我的正则表达式不起作用,因此出现错误。谁能帮我写一个正确的:

这是我尝试编写正则表达式的模式:

MSM8_BD_V4.3_1-1_idle-Kr_Run3.xlsx
MSM8_BD_V4.3_2-6_mp3-Kr_Run2.xlsx
MSM8_BD_V4.3_Camera_snap-7.xlsx
MSM8_BD_V4.3_Camera_snap-8.xlsx
MSM8_BD_V4.3_Radio_202.16-0.xlsx

我正在尝试获取子字符串的粗体部分

下面是我试过的正则表达式:

my $line = "MSM8939_BD_V4.3_1-1_idle-Kratos_Run3.xlsx";
my ($captured) = $line =~ /MSM8939_BD_V4\.\3\_[d]*(.+?)\w/gx;
print "$captured\n"; 

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    [d] 只匹配文字字母d。您希望\d(不带括号)匹配一个数字。但是,您似乎还想包含下划线。那将是[\d_]

    试试这个:

    /^MSM8_BD_V4\.3_[\d_]*-?([^-]+)/
    

    如果我在你的输入上运行它(例如perl -nE 'say $1 if /^MSM8_BD_V4\.3_[\d_]*-?([^-]+)/'),我会得到这个输出:

    1_idle
    6_mp3
    Camera_snap
    Camera_snap
    Radio_202.16
    

    【讨论】:

    • 你能帮我写完整的正则表达式吗
    • 但我收到错误消息:在连接 (.) 中使用未初始化的值 $1。我使用的是Windows7平台。与我使用的代码相同:(
    • 感谢马克的快速帮助!!
    • 你一定有错别字,@user1362796。我的代码不会尝试打印出$1,除非正则表达式匹配,如果不设置$1,正则表达式就无法匹配。
    【解决方案2】:
    my $line = "MSM8939_BD_V4.3_1-1_idle-Kratos_Run3.xlsx";
    
    for (qw(
        MSM8939_BD_V4.3_1-1_idle-Kratos_Run3.xlsx
        MSM8939_BD_V4.3_2-6_mp3-Kratos_Run2.xlsx
        MSM8939_BD_V4.3_Camera_snap-7.xlsx
        MSM8939_BD_V4.3_Camera_snap-8.xlsx
        MSM8939_BD_V4.3_Radio_202.16-0.xlsx
    )) {
        my ($captured) = ($_ =~ /.*[-_]([^\W_]+_[\w.]+)-/gx);
        print "$captured\n";
    }
    

    尽可能使用贪心模式,然后抓住最后两个看起来像你想要的字符串,后面仍然跟一个连字符。

    正如我在打字时刚刚编辑的另一个答案一样,这会产生:

    1_idle
    6_mp3
    Camera_snap
    Camera_snap
    Radio_202.16
    

    这个可能更通用,因为子字符串的开头不是硬编码的,也就是说,您可以在其他不一定以 MSM8_BD_V4.3 开头的情况下使用它。

    【讨论】:

    • 感谢约瑟夫的快速帮助!
    • 不客气!如果您在大量数据上运行此程序,并且稍后由于某种原因意识到您需要匹配同样出现的不同模式并且您需要调整正则表达式以适应,请随时再次询问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多