这是一个创建于 4396 天前的主题,其中的信息可能已经有所发展或是发生改变。
<?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](https://cdn.v2ex.com/avatar/9dea/c1b9/21225_normal.png?m=1492088433) |
|
1
haiyang416 2013-02-03 09:04:07 +08:00 1
请搜索非捕获组。
|
![alexrezit](https://cdn.v2ex.com/avatar/f41b/a39d/18119_normal.png?m=1395495514) |
|
2
alexrezit 2013-02-03 09:13:36 +08:00 via iPhone 1
难道不是用 ?: 和 (|) 来处理?
|