RegEx(字:123,345,567 - > word.123,word.345,word.567)

时间:2015-01-17 07:24:47

标签: regex concatenation prefix

我很遗憾没能解决这个正则表达式的问题,我不希望光会永远存在。因此,现在是时候寻求帮助了。 我有一个很长的txt文件,其中重复的行是这样的:

acteur: 634, 681, 731

我希望将其转换为:

Acteur.634,Acteur.681,Acteur.731

当然,我不想改变任何其他线路。只有以acteur:开头的行才会受到影响。

这是我文件的片段(纯文本):

inbob: -1
mention: 
Il n'est pas distingué
acteur: 731
lieu: 
editeur: Les étoiles de la chanson
collection: 
numed: 
nbv: 
nbp: 
date: [1934]
date2: 1934
(:remarque:Deuxième vérification faite : ok:)");

type: 
inbob: -1
mention: 
Comme un moineau
acteur: 634, 681, 731
lieu: 
editeur: Les étoiles de la chanson
collection: 
numed: 
nbv: 
nbp: 
date: [1930]
date2: 1930
(:remarque::)");

目标是:

inbob: -1
mention: 
Il n'est pas distingué
Acteur.731
lieu: 
editeur: Les étoiles de la chanson
collection: 
numed: 
nbv: 
nbp: 
date: [1934]
date2: 1934
(:remarque:Deuxième vérification faite : ok:)");

type: 
inbob: -1
mention: 
Comme un moineau
Acteur.634,Acteur.681,Acteur.731
lieu: 
editeur: Les étoiles de la chanson
collection: 
numed: 
nbv: 
nbp: 
date: [1930]
date2: 1930
(:remarque::)");

搜索([0-9]+)并替换为Acteur.$1可以完成工作,但会更改所有文件。我想不知道如何将进程限制为以acteur:开头的行,我知道我错过了正确的方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您正在运行PHP,则以下正则表达式可以帮助您。

^(?!acteur:).*(*SKIP)(*F)|(?:^acteur:\h+|\h+)

preg_replace中使用上述正则表达式,然后将匹配的字符替换为Acteur.

^(?!acteur:).*匹配以acteur:开头的所有行,而后面的(*SKIP)(*F)会使整个匹配失败。

^acteur:\h+从剩下的字符串中,此正则表达式将匹配部分acteur:以及以下一个或多个空格字符。 |或,\h+其他剩余的一个或多个空格字符。请注意,这与不以acteur开头的行上的空格不匹配,因为我们已经跳过了这些行。

DEMO

$str = <<< EOT
inbob: -1
mention: 
Il n'est pas distingué
acteur: 731
lieu: 
editeur: Les étoiles de la chanson
collection: 
numed: 
nbv: 
nbp: 
date: [1934]
date2: 1934
(:remarque:Deuxième vérification faite : ok:)");

type: 
inbob: -1
mention: 
Comme un moineau
acteur: 634, 681, 731
lieu: 
editeur: Les étoiles de la chanson
collection: 
numed: 
nbv: 
nbp: 
date: [1930]
date2: 1930
(:remarque::)");
EOT;
echo preg_replace('~^(?!acteur:).*(*SKIP)(*F)|(?:^acteur:\h+|\h+)~um', 'Acteur.', $str);