Php 在字母数字组后插入数字,后面不跟数字组

Php 在字母数字组后插入数字,后面不跟数字组,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个字符串,其中包含一个或多个字母数字代码(以字母开头),以下划线分隔。有些代码后面跟一个索引号,索引号也用下划线分隔 我想在每个代码之后插入一个索引号(始终为1),该代码后面没有索引 以下是一些示例: one => one_1 one_tw2_tre_for => one_1_tw2_1_tre_1_for_1 one_tw2_tre_23_for => one_1_tw2_1_tre_23_for_1 one_3_tw2_

我有一个字符串,其中包含一个或多个字母数字代码(以字母开头),以下划线分隔。有些代码后面跟一个索引号,索引号也用下划线分隔

我想在每个代码之后插入一个索引号(始终为1),该代码后面没有索引

以下是一些示例:

one                 =>  one_1
one_tw2_tre_for     =>  one_1_tw2_1_tre_1_for_1
one_tw2_tre_23_for  =>  one_1_tw2_1_tre_23_for_1
one_3_tw2_4_tre_45  =>  one_3_tw2_4_tre_45
我可以通过两次调用preg_replace来完成:

// Add '_1' after each code
$s = preg_replace('/[A-Za-z][A-Za-z0-9]+/', '$0_1', $s);
// Remove '_1' when followed by index
$s = preg_replace('/_1_([0-9]+)/', '_$1', $s);
我想知道是否有一种方法可以让两个人只替换一个preg_(我尝试了向前看和向后看,但没有成功),或者另一种方法可能更快,更适合处理器

谢谢!:-)

或者更简洁地说:

preg_replace('/[A-Za-z][A-Za-z0-9]+(?=_|$)(?!_[0-9])/', '$0_1', $s);

啊哈!现在我理解了关于前瞻的“零宽度”注释!我可以有一个正数和一个负数,最后检查同一个字符(在本例中是“”)。干杯你会相信我用了5年才意识到我可以将倍数合并在一起吗。哦,我本可以节省的时间。。。
preg_replace('/[A-Za-z][A-Za-z0-9]+(?=_|$)(?!_[0-9])/', '$0_1', $s);