Answers
是指这个特例还是指普遍情况?
如果是普遍情况的话,不可能在不解读文字语义的情况下靠纯正则实现。
正则需要足够的约定条件来明确,比如说,是否每个行号后面的标点符号都按你上面的例子一样,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