求一个正则表达式


将下面的文字分割成5段

1、其他文字2、3.879(其他文字中包括小数)3.123加4、加其他(其他文字中包括数字和顿号)4、(其他文字为空)5.其他文字
(数字开头后面跟着顿号和点符号)
1、其他文字
2、3.879(其他文字中包括小数)
3.123加4、加其他(其他文字中包括数字和顿号)
4、(其他文字为空)
5.其他文字

如果不用正则,PHP下有其他解决办法吗?

正则表达式 php

街头解小手 11 years, 4 months ago

是指这个特例还是指普遍情况?
如果是普遍情况的话,不可能在不解读文字语义的情况下靠纯正则实现。
正则需要足够的约定条件来明确,比如说,是否每个行号后面的标点符号都按你上面的例子一样,1、2、4后面就是顿号,3、5后面就是点号?

暂时先按照你这个特例来弄一个来玩玩。(其他文字为空)这部分我先当作删掉处理了……

 $t="1、其他文字2、3.879(其他文字中包括小数3.154)3.123加4、加其他(其他文字中包括数字和顿号)4、5.其他文字";
$re='~
    1、[^\d]+
    |2、[^、]+(?=3\.)
    |3\..+(?=4、)
    |4、.*(?=5.)
    |5\..*
    ~x';
if (preg_match_all($re, $t, $tokens, PREG_PATTERN_ORDER)) {
    foreach ($tokens[0] as $w) {
        echo "<br/>".$w."<br/>";
    }
}

说实话我觉得用简单正则(数字、点号、顿号、其他四种情况)把整段话拆散,依次读入并逐步按逻辑规则归档的方式来做(类似于readline的形式逐行读取)最明确,适用面也是最广的,因为这样至少有完善的缓存回退机制(例如读到2、时即可输出1、,后再次读到下一个顿号时可以回退到上一个3.输出,读到最后一个.后回退到上一个4、输出)。正则的非捕捉匹配在复杂情况下实在不是太给力啊……

wichan answered 11 years, 4 months ago

Your Answer