30

R に次のベクトルがあり、数字の 2 ではなく、A と B を含むすべての文字列を検索したいと考えています。

vec1<-c("A_cont_1", "A_cont_12", "B_treat_8", "AB_cont_22", "cont_21_Aa")

以下は機能しません。

grep("A|B|!2", vec1)

それは私にすべての文字列を返します:

[1] 1 2 3 4 5

次の例でも同じです。

grep("A|B|-2", vec1)

正しい構文は何でしょうか?

4

5 に答える 5

38

これは、かなり単純な正規表現で行うことができます。

grep("^[^2]*[AB][^2]*$", vec1)

つまり、次のことを意味します。

  • ^文字列の先頭に一致
  • [^2]*"2"以外、0 回以上一致
  • [AB]「A」または「B」に一致
  • [^2]*"2"以外、0 回以上一致
  • $文字列の末尾に一致
于 2013-08-14T19:13:25.733 に答える
22

OP、あなたの試みはかなり近いです、これを試してください:

grep('^(A|B|[^2])*$', vec1)
于 2013-08-14T21:12:59.957 に答える
4

grep一般に、1 回の呼び出しで肯定検索と否定検索を実行する場合、あまりうまく機能しません。複雑な正規表現で動作させることができるかもしれませんが、次のようにする方が良いかもしれません:

 grep '[AB]' somefile.txt | grep -v '2'

それに相当するRは次のようになります。

grep("2", grep("A|B", vec1, value = T), invert = T)
于 2013-08-14T18:00:35.163 に答える