2017-09-18 6 views
1

なぜ私は逆参照の逆転を防ぐために2つのバックスラッシュを使用する必要があるのか​​分かりません。以下は、私は私の問題を発見し、どのように私の詳細:gsubでバックスラッシュを1つ使用すると、Rで正規表現の逆参照が逆転するのはなぜですか?

x <- 53/100 000

そして、このように見えるためにそれを変換:

53/100000

私はこのようになります文字を変換したいです

ここに私がこの質問をする前に私が持っていたいくつかのアイデアがあります:

私は考えましたgsub関数を使用して、/文字の後に続くすべての空白を削除することができます。しかし、私は正規表現の解決策がより洗練された/効率的かもしれないと思った。

まず、私は正規表現で後方参照する方法を知りませんでしたので、私はこれを試してみました:

> gsub("/.+\\s",".+",x) [1] "53.+000"

は、その後、私はあなたが this websiteから \1を使用して撮影したパターンを後方参照することができますことをお読みください。だから私は、これを使用し始めた:

> gsub("/.+\\s","\1",x) [1] "53\001000"

その後、私は後方参照のみワイルドカード一致を考慮することを実現しました。しかし、私は/の文字を保持したかった。私はその後、他のものの束を試みたが、私は、余分なバックスラッシュを追加し、括弧で私のワイルドカードを封入することによって、それを固定

> gsub("/.+\\s","/\1",x) [1] "53/\001000"

> gsub("/(.+)\\s","/\\1",x) [1] "53/100000"

だから私は後ろにこれを追加しましたさらに、置換えの冒頭に左括弧を挿入して、/文字を削除することができました。

> gsub("(/.+)\\s","\\1",x) [1] "53/100000"

Hmのように、括弧と余分なバックスラッシュの2つが必要と思われました。あなたが逆参照しているテキストの部分が括弧で示されていると信じているので、私が思うと思う括弧。

2つのバックスラッシュが必要な理由はわかりません。the reference websiteからは、\lのみが必要とされます。何が起きてる?なぜ私の後方参照は逆転しているのですか?

答えて

2

Rが "\ 1"をエスケープ文字として解析してからgsubに渡さないように、余分なバックスラッシュが必要です。 "\\ 1"はgsubによって正規表現\ 1として読み込まれます。

+0

私は今理解しています。 "\ 1"はgsubで "\ 001"と表示され、私のパターンは "100"だったので、私は非常に不幸でした。答えてくれてありがとう。 –

関連する問題