2014-03-18 66 views
0

我在Matlab中有一個字符串,並且想要用另一個模式替換其中某個模式的第三個外觀。我怎樣才能做到這一點?在regexprep中選擇模式

例如:

str = 'ter-yu-ter-u-ter-hg'; 
patternRemove = 'ter'; 
patternAdd = 'mov'; 

答案:

str = 'ter-yu-ter-u-mov-hg'; 

回答

1
str = 'ter-yu-ter-u-ter-hg'; 
patternRemove = 'ter'; 
patternAdd = 'mov'; 

ind = regexp(str,patternRemove); 
ii = ind(3); 
strOut = [str(1:ii-1) patternAdd str(ii+numel(patternRemove):end)]; 
1

對不起,我不能給你更多的幫助,但我不知道你會如何去了解它在Matlab。如果我試圖解決這個問題,那我就是這麼做的。

<?php 

$i = 0; // SET A DEFAULT VALUE FOR OUR COUNTER 
$str = 'ter-yu-ter-u-ter-hg-ter-as-b-ter-a-sdf-w-ter-s-ter-asd'; // TEXT TO WORK ON 
$remove = 'ter'; // TEXT TO REPLACE EACH THIRD OCCURRENCE OF 
$replace = 'mov'; // TEXT TO REPLACE EACH THIRD OCCURRENCE WITH 

// USE A CALLBACK FUNCTION TO CHECK TO SEE HOW MANY TIMES IT'S FOUND A MATCH 
// INCREMENT THE COUNTER EACH TIME 
// IF THE COUNTER IS 3, RESET IT TO ZERO AND MAKE THE REPLACEMENT 
$string = preg_replace_callback('/'.$remove.'/', function($m) use(&$i, $remove, $replace) {$a = $remove; if (++$i == 3) {$i = 0; $a = $replace;} return $a;}, $str); 

print $string; 

此輸出以下:

ter-yu-ter-u-mov-hg-ter-as-b-ter-a-sdf-w-mov-s-ter-asd 

如果你沒有類似於preg_replace_callback一個功能,你很可能在爆炸你的搜索詞成段,打破它除了在remove。然後遍歷所有的字符串部分,並每次增加計數器。如果計數器除以三的餘數爲零,則應用您的替換。

下面是一個使用foreach一個例子:

// SET THE DEFAULTS 
$i = 0; 
$str = 'ter-yu-ter-u-ter-hg-ter-as-b-ter-a-sdf-w-ter-s-ter-asd'; 
$remove = 'ter'; 
$replace = 'mov'; 
$final_string = ''; // THIS WILL BE OUR OUTPUT STRING LATER 

// BREAK APART THE STRING INTO AN ARRAY OF MATCHES, BASED ON THE $remove VALUE 
$matches_for_remove = explode($remove, $str); 

// LOOP THROUGH EACH ITEM IN THE ARRAY 
foreach ($matches_for_remove AS $match) { 

    // SET THE DEFAULT STRING TO $remove 
    $replacement_string = $remove; 
    if (++$i % 3 == 0) { // IF THE REMAINDER IS ZERO, THEN DO THE REPLACEMENT 
     $replacement_string = $replace; 
    } 

    // IF IT'S NOT THE END, APPEND THE remove OR replace PORTION ON TO THE END 
    if ($i == count($matches_for_remove)){ 
     $final_string .= $match; 
    } 
    else { 
     $final_string .= $match.$replacement_string; 
    } 

} 

print $final_string; 

而同樣的例子,但使用for循環,而不是一個foreach

$str = 'ter-yu-ter-u-ter-hg-ter-as-b-ter-a-sdf-w-ter-s-ter-asd'; 
$remove = 'ter'; 
$replace = 'mov'; 
$final_string = ''; 

for ($i = 0; $i < count($matches_for_remove); $i++) { 

    $replacement_string = $remove; 

    if (($i + 1) % 3 == 0) { 
     $replacement_string = $replace; 
    } 

    if ($i == count($matches_for_remove) - 1) { 
     $final_string .= $matches_for_remove[$i]; 
    } 
    else { 
     $final_string .= $matches_for_remove[$i].$replacement_string; 
    } 

} 

print $final_string; 

再次,對不起,如果我的例子,用PHP編寫的沒有任何意義。我理解這個概念,而不是如何將它翻譯成Matlab。但希望這至少會讓你指出正確的方向。