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

2013-02-03 05:41:08 +08:00
 no2x
<?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)]/ 如果 [ ] 里的字母不是集合,而是可以当字符串用,该多简单。

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

(但愿我表达清楚了。)
2001 次点击
所在节点    正则表达式
3 条回复
haiyang416
2013-02-03 09:04:07 +08:00
请搜索非捕获组。
alexrezit
2013-02-03 09:13:36 +08:00
难道不是用 ?: 和 (|) 来处理?
no2x
2013-02-03 14:14:41 +08:00
@haiyang416 还真不知道呢。谢谢。@alexrezit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/59620

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX