2017-06-03 1 views
0

Est-il possible d'écrire une expression régulière de sorte que le premier signe $ sera remplacé par un (, le second avec a), le troisième avec un (, etc?Comment remplacer le caractère à la position paire par (et la position impaire par)

par exemple, la chaîne

This is an $example$ of what I want, $ 1+1=2 $ and $ 2+2=4$. 

devrait devenir

This is an (example) of what I want, (1+1=2) and (2+2=4). 
+0

Non. Regex permet de rechercher des motifs (un ou plusieurs avec le drapeau global) et non la énième occurrence d'un caractère. Vous devez spécifier l'environnement pour appliquer une regex utile ici (par exemple, chaque '$' directement avant/après un nombre). Il vaut mieux utiliser simplement une fonction d'index pour trouver tous les indices où un certain caractère est. –

+0

S'il vous plaît ajouter un tag de langue. –

Répondre

0

Trier d'une solution indirecte, mais dans certaines langues, vous pouvez utiliser un callback function pour le Rempl ciment. Vous pouvez ensuite parcourir les options de cette fonction. Cela fonctionnerait également avec plus de deux options. Par exemple, en Python:

>>> text = "This is an $example$ of what I want, $ 1+1=2 $ and $ 2+2=4$." 
>>> options = itertools.cycle(["(", ")"]) 
>>> re.sub(r"\$", lambda m: next(options), text) 
'This is an (example) of what I want, (1+1=2) and (2+2=4).' 

Ou, si ceux qui apparaissent toujours par paires, comme il semble être le cas dans votre exemple, vous pouvez correspondre à la fois $ et tout le reste, puis remplacer le $ et la réutilisation la substance entre en utilisant une référence de groupe \1; mais encore une fois, toutes les langues prennent en charge les:

>>> re.sub(r"\$(.*?)\$", r"(\1)", text) 
'This is an (example) of what I want, (1+1=2) and (2+2=4).' 
0

En R, vous pouvez utiliser str_replace, qui ne remplace que le premier match, et une boucle while pour faire face aux paires de correspondances à la fois.

# For str_* 
library(stringr) 
# For the pipes 
library(magrittr) 

str <- "asdfasdf $asdfa$ asdfasdf $asdf$ adsfasdf$asdf$" 

while(any(str_detect(str, "\\$"))) { 
    str <- str %>% 
    str_replace("\\$", "(") %>% 
    str_replace("\\$", ")") 
} 

Ce n'est pas la solution la plus efficace, sans doute, mais il passera par et remplacer $ avec (et) à travers toute la chaîne.

+0

Quelle langue est-ce? Je suppose que 'str_replace' ici ne remplacera que la première instance qu'il trouve? Vous pourriez vouloir ajouter cette information. –

+0

Désolé, pensé que cela a été marqué avec R. Mis à jour. –

0

En JavaScript:

function replace$(str) { 
    let first = false; 
    return str.replace(/\$/, _ => (first = !first) ? '(' : ')'); 
}