2017-06-04 52 views
0

如何在特定字符的特定事件之間選擇文本?如何在特定字符的特定事件之間選擇文本

例如在下面的字符串:

的Lorem |存有|是|簡單|虛擬|文| A123 |印刷| |排版|工業|

我想刪除/替換第6和第7次出現的'|'之間的文本字符,即單詞'A123'。

使用正則表達式可以這麼做嗎?

回答

1

可以使用計數器量詞,通常用數字大括號內表示(例如,pattern{7})。例如,這個sed命令用REP代替A123:

sed 's/\(\([^|]*|\)\{6\}\)[^|]*/\1REP/' 
1

您沒有指定POSIX,PCRE或其他一些正則表達式,但我會假設PCRE。雖然正則表達式不允許您選擇「字符N次出現」,但如果存在某種模式,您總是可以選擇第N次出現的組。

在你的情況下,由於管道是一個分離器,你可以隨時選擇一組任意字符後跟一個管道,然後選擇該組6次,然後選擇什麼,直到下水管真正得到你的角色。既然你似乎是最活躍的PHP,這裏有一個PHP的方法:

$data = "Lorem|Ipsum|is|simply|dummy|text|A123|the|printing|and|typesetting|industry|"; 
$foo_data = preg_replace('/^((.*?\|){6})[^|]+/', '$1FOO', $data); 
echo $foo_data; // Lorem|Ipsum|is|FOO|dummy|text|A123|the|printing|and|typesetting|industry| 

,如果你想更換每第七發生,您可以刪除前導插入符號。如果您需要操作/提取它,也可以在第二部分([^|]+)周圍添加括號。

+0

爲了讓您的preg_replace之前'在替換參數FOO'使用的參考值,我發現這工作:'$ foo_data =的preg_replace('/ ^(:(?:?。?* \ |) {6})\ K([^ |] +)/','$ 1FOO',$ data);'或this:'$ foo_data = preg_replace('/ ^((。*?\ |){6}) \ K([^ |] +)/','$ 3FOO',$ data);' – mickmackusa