正则表达式在同一记录中将字符串从一个地方替换为另一个地方

时间:2017-10-24 05:33:53

标签: php regex

我有一个以|符号分隔的记录。我需要在同一记录中将一个字符串从一个地方替换为另一个地方:

我的输入如下: BANG|ADAR|**285815**|MOTOR|GOOD||INDIA|2.4|SOFTWARE|285816_AKS|SAB_PART|**AKS_PN|285816**

我需要在285815之后将AKS_PN替换为字符串,在这种情况下,我需要将285815替换为285816

使用(([^|]*\|){3})(.*)我能够获取285815,需要在同一正则表达式中AKS_PN之后获取字符串的帮助。

我知道如何将285815替换为285816。我正在使用PHP。

1 个答案:

答案 0 :(得分:0)

正则表达式解决方案

您需要使用捕获组。一般来说:

(everything_before)(interesting_part_1)(between)(interesting_part_in_the_end)

然后,按照您的意愿将它放在一起

(everything_before)(interesting_part_in_the_end)(between)

这会从最终字符串中留下(interesting_part_1)

<小时/> 在您的具体示例中,这可能归结为

^((?:[^|]*\|){2})([^|]*)\|(.*?AKS_PN)\|(.*)

需要替换为

$1$4|$3

查看example on regex101.com(仍不确定如何处理此处285815)。

<小时/> PHP中的所有内容:

<?php

$string = "BANG|ADAR|285815|MOTOR|GOOD||INDIA|2.4|SOFTWARE|285816_AKS|SAB_PART|AKS_PN|285816";

$regex = '~^((?:[^|]*\|){2})([^|]*)\|(.*?AKS_PN)\|(.*)~';

$string = preg_replace($regex, "$1$4|$3", $string);
echo $string;
# BANG|ADAR|285816|MOTOR|GOOD||INDIA|2.4|SOFTWARE|285816_AKS|SAB_PART|AKS_PN
?>

<小时/>

非正则表达式解决方案

你甚至不需要这里的正则表达式(太复杂了),之后只需拆分,切换和连接:

<?php

$string = "BANG|ADAR|285815|MOTOR|GOOD||INDIA|2.4|SOFTWARE|285816_AKS|SAB_PART|AKS_PN|285816";

$parts = explode("|", $string);
$parts[2] = $parts[count($parts) - 1];
$string = implode("|", $parts);

echo $string;
?>