【问题标题】:Pattern matching in PerlPerl 中的模式匹配
【发布时间】:2013-03-08 19:10:45
【问题描述】:

我正在为以下一些名称进行模式匹配:

ABCD123_HH1
ABCD123_HH1_K

现在,我的 grep 以上名称的代码如下:

($name, $kind) = $dirname =~ /ABCD(\d+)\w*_([\w\d]+)/; 

现在,我面临的问题是我在$dirname 中得到了ABCD123_HH1ABCD123_HH1_K 的模式。但是,我的变量$kind 不接受这个ABCD123_HH1_K。它确实采用ABCD123_HH1 模式。

珍惜你的时间。您能否告诉我如何使用_k 获得模式。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    您需要将_K 部分添加到正则表达式的末尾,并使用? 使其成为可选:

    /ABCD(\d+)_([\w\d]+(_K)?)/
    

    我还删除了\w*,这是无用的,并且使您无法正确获取HH1_K

    【讨论】:

    • 使用(_K)?而不是(_K)*来避免匹配_K的多个实例不是更好吗(我猜这取决于OP想要什么)?
    • @PhilipKendall 据我了解,他的字符串要么有“_K”,要么没有,所以我认为它不会改变任何东西。无论如何,你的解决方案更好,所以我会编辑:)
    • 谢谢alestanis 和philip。所以,我应该添加我的代码如下:($name, $kind) = $dirname =~ /ABCD(\d+)\w*_([\w\d]+)(_K)/;让我试试,顺便说一句,我是“她”:)
    • @user1985039 不要忘记?_K 之后,否则您将无法匹配ABCD123_HH1
    • @user1985039 我刚刚测试了正则表达式并意识到它在ABCD123_HH1_K 的情况下不起作用,因为你有一个额外的\w* 弄错了。我更正了答案中的正则表达式。看看吧!
    【解决方案2】:

    您应该检查 _K 是否出现零次或多次。

    Perl 的正则表达式中的* 表示零次或多次

    + 表示至少一次或多次。

    因此,在您的正则表达式中,附加 (_K)*

    最后,你的正则表达式应该是这样的:

    /ABCD(\d+)\w*_([\w\d]+(_K)*)/
    

    【讨论】:

    • 嗨,它仍然没有采取...我正在打印 $kind 并且它没有显示带有 _K 变量的模式。 :(
    • 我希望 $kind 将整个内容打印为 "HH1_K" 和 $name 作为 "ABCD123"
    【解决方案3】:

    \w 包括字母、数字和下划线。

    所以你可以使用这样简单的东西: /ABCD\w+/

    【讨论】:

    • 不,它拔出了一个正在打印的...我会试试的,谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多