9

文の先頭から最初の まですべてを取得したい次の正規表現があります##strsplitこのタスクを実行するために実証したように使用できますが、gsub解決策を優先しています。が正しいツールではない場合gusub(私はそうだと思います)、基本的な正規表現ツールを学びたいので、基本的なソリューションを好みます。

x <- "gfd gdr tsvfvetrv erv tevgergre ## vev fe ## vgrrgf"

strsplit(x, "##")[[c(1, 1)]]  #works

gsub("(.*)(##.*)", "\\1", x)  #I want to work
4

6 に答える 6

17

1文字追加するだけ?で、最初の量指定子の後に a を追加して、「非貪欲」にします。

gsub("(.*?)(##.*)", "\\1", x) 
# [1] "gfd gdr tsvfvetrv erv tevgergre "

関連するドキュメントは次のとおりです。?regex

デフォルトでは、繰り返しは貪欲であるため、可能な最大数の繰り返しが使用されます。これは、「?」を追加することで「最小」に変更できます。数量詞に。

于 2012-11-28T15:56:41.197 に答える
4

私は言います:

sub("##.*", "", x)

の最初の出現以降を含むすべてを削除します##

于 2012-11-28T15:53:07.950 に答える
4

この場合、逆に言えば、次#のすべてを空の文字列に置き換えます。

gsub("#.*$", "", x)
[1] "gfd gdr tsvfvetrv erv tevgergre "

ただし、貪欲でない修飾子を使用して、?提案した方法で正規表現を機能させることもできます。

gsub("(.*?)#.*$", "\\1", x)
[1] "gfd gdr tsvfvetrv erv tevgergre "
于 2012-11-28T15:54:04.583 に答える
3

これは、より複雑な正規表現の代わりに、より多くの文字列ツールを使用する別のアプローチです。最初に最初の##の場所を見つけ、次にそのポイントまでの部分文字列を抽出します。

library(stringr)
x <- "gfd gdr tsvfvetrv erv tevgergre ## vev fe ## vgrrgf"
loc <- str_locate(x, "##")
str_sub(x, 1, loc[, "start"] - 1)

一般的に、この種の段階的なアプローチは、複雑な正規表現よりも保守しやすいと思います。

于 2012-11-28T16:48:01.853 に答える
1

ここにはすでにいくつかの簡単な回答がありますが、質問でベースRでの正規表現サポートについて学びたいと述べたので、肯定的な先読みアサーション(?=#)と貪欲でないオプションを使用する別の方法があります(?U)

regmatches(x, regexpr('(?U)^.+(?=#)', x, perl=TRUE))
[1] "gfd gdr tsvfvetrv erv tevgergre "
于 2012-11-28T16:02:42.550 に答える
1

これを正規表現として試してください

^[^#]+

文字列の先頭から始まり、最初の文字列以外のすべてに一致し#ます#

于 2012-11-28T15:50:55.423 に答える