2017-06-03 58 views
0

正規表現を書き留めて、最初の$記号を(、2番目の)記号で置き換え、3番目の記号を(など?偶数位置での文字の置き換え方法(と奇数位置による)

例えば、文字列

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

は、間接的なソリューションの

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

いいえ。正規表現は、1文字のn番目のパターンではなく、グローバルフラグで1つまたは複数のパターンを検索するためのものです。ここで便利な正規表現を適用するには、周囲を指定する必要があります(たとえば、数値の前後にあるすべての '$ ')。インデックス関数を使用して、特定の文字があるすべてのインデックスを見つけるほうがよいでしょう。 –

+0

言語タグを追加してください。 –

答えて

0

ソートになる必要がありますが、一部の言語では、あなたはreplaためcallback functionを使用することができますセメント。その機能のオプションを順番に調べることができます。これは2つ以上のオプションでも機能します。例えば、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).' 

それとも、あなたの例ではケースのように思えるようものは常に、ペアで表示された場合、あなたはその間の両方$、すべてを一致して、$と再利用を置き換えることができますグループ参照を使用して間のもの\1;しかし、再び、ではないすべての言語がそれらのサポート:Rで

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

を、一度にマッチのペアに対処するだけで最初のマッチを置き換えるstr_replaceと、whileループを使用することができます。

# 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("\\$", ")") 
} 

これはおそらく、最も効率的な解決策ではないのですが、それは通過として$を交換(および)、文字列全体を通じてます。 JavaScriptで

+0

これはどの言語ですか?私は 'str_replace'は、見つかった最初のインスタンスだけを置き換えますと仮定します。その情報を追加することもできます。 –

+0

申し訳ありませんが、これはRでタグ付けされていると考えました。更新されました。 –

0

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