V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
no2x
V2EX  ›  正则表达式

匹配字符串组合,求指点,我已经被绕晕了。

  •  
  •   no2x · 2013-02-03 05:41:08 +08:00 · 2187 次点击
    这是一个创建于 4306 天前的主题,其中的信息可能已经有所发展或是发生改变。
    <?php
    $String = 'WTRSUE+ABSSUE++ABDA+ABGCSUE+CDIH+CDJNUSX+CDGBHCSUSX+ABFFA';
    $Pattern = '/(SUE(\+(AB|CD)))|(USX(\+AB))/';
    //$Pattern = '/((SUE|USX)(\+AB))|(SUE(\+CD))/'; //第 2 种写法
    //$Pattern = '/(SUE(\+AB))|(SUE(\+CD))|(USX(\+AB))/'; //第 3 种写法
    if ( Preg_match_all( $Pattern, $String, $result )) {
    echo ('<xmp>');
    print_r ( $result );
    echo ('</xmp>');
    }

    如 $String 所述,待处理的字符串里有 SUE+AB 和 SUE+CD 和 USX+AB 这 3 个组合字符串中的 +AB 和 +CD 是我需要匹配提取出来的。(为测试效果,我在待处理的字符串里加了几个错误的组合进去。正确的只有这 3 个。)

    (待处理字符串中的都是举例,AB 或 CD 的组合实际上还有十几种,我为了简单,用 AB 或 CD 这样的简单特征代表)

    然后我尝试写了这 3 个 Pattern 来匹配。结果,是一堆的小括号啊。我被绕晕了。

    每一个小括号就代表会被存储到一个数组变量里。而我后面还有十几种组合呢。那不 N 多个数组变量?

    /[SUE(\+[AB|CD])]|[USX(\+AB)]/ 如果 [ ] 里的字母不是集合,而是可以当字符串用,该多简单。

    我自学正则表达式的,我不知道是否有这类的写法?或者有更好的匹配?求解。

    (但愿我表达清楚了。)
    3 条回复    1970-01-01 08:00:00 +08:00
    haiyang416
        1
    haiyang416  
       2013-02-03 09:04:07 +08:00   ❤️ 1
    请搜索非捕获组。
    alexrezit
        2
    alexrezit  
       2013-02-03 09:13:36 +08:00 via iPhone   ❤️ 1
    难道不是用 ?: 和 (|) 来处理?
    no2x
        3
    no2x  
    OP
       2013-02-03 14:14:41 +08:00
    @haiyang416 还真不知道呢。谢谢。@alexrezit
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1273 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:55 · PVG 01:55 · LAX 09:55 · JFK 12:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.