11

9 つ以上の後方参照で gsub を使用するには? 以下の例の出力は「e、g、i、j、o」になると思います。

> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"
4

6 に答える 6

9

R言語の正規表現を参照してください。

\1置換テキストの後方参照を使用して、キャプチャグループ\9と一致するテキストを再挿入できます。全体的な一致の代わりのテキストトークンはありません。正規表現全体をキャプチャグループに配置してから、を使用します。\1

ただし、PCREを使用すると、名前付きグループを使用できるはずです。したがって、グループ化された命名と後方参照として試してください。(?P<name>regex)(?P=name)

于 2009-09-09T17:37:14.560 に答える
4

strsplit代わりに使用してください:

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
于 2009-09-09T19:30:46.800 に答える
3

\10 は、後方参照 0 の後に数字の 1 が続くものとして理解されるというのが私の理解でした。私は 9 が最大だと思います。

于 2009-09-09T17:24:11.003 に答える
2

stringiパッケージのstri_replace_*_regex関数には、そのような制限はありません。

library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"

最初のキャプチャ グループを 1 で追跡する場合は、たとえば次のように使用します。

stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
于 2014-06-13T13:35:38.000 に答える
1

このサイトによると、\10 から \99 までの後方参照は一部の言語では機能しますが、ほとんどの言語では機能しません。

動作することが報告されているものは、

于 2009-09-09T17:33:10.030 に答える
0

この 9 回の後方参照への制限は、sub()andgsub()関数に固有のものであり、and などの関数には固有のものではありませんgrep()。R での 9 つを超える後方参照のサポートは、PCRE 正規表現 (つまりperl=TRUE引数) の使用を意味します。ただし、このオプションを使用しても、sub() および gsub() 関数はサポートしていません。

R のドキュメントは、この点について明示的です: を参照してください。 ?regexp

There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).

さらに、この制限を回避するために名前付きキャプチャ グループを使用するというアイデアは、名前付きキャプチャ グループが sub() 関数でサポートされていないため、必ず失敗します。

regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)
于 2015-10-25T17:23:38.293 に答える