1

"foo"または"foo|baz|bar"(1つの単語またはのような特殊文字で区切られた複数の単語)の形式のシーケンスのベクトルがあり"|"、単語も与えられ、ベクトルのどの項目に単語全体が一致するかを調べたいとします。

たとえば、単語"foo"のは完全一致ですが、または"foo|baz|bar"のいずれかで完全一致ではありませ"foobaz|bar""bazfoo"

最初に"\\b"、単語全体の開始エッジまたは終了エッジのいずれかを示すものを使用しようとしましたが、正常に機能します。

grep("\\bfoo\\b", "foo")         # match
grep("\\bfoo\\b", "foobaz|bar")  # mismatch    
grep("\\bfoo\\b", "bazfoo")      # mismatch

"|"次に、両端のもう1つの可能なセパレーターとして追加し、andを使用してグループ化しようとしまし"\\b"た。[]

grep("[|\\b]foo[|\\b]", "foo|baz|bar")  # mismatch!
grep("[|\\b]foo[|\\b]", "foo")          # mismatch!

後で私が見つけたのは、文字列の開始または終了\\bの指標ではなく、単語全体の開始または終了です(スペースのような非常に多くの文字ですが、数字や下線は単語全体を区切りません)。したがって、これらすべての文字列に一致しますが、またはには一致しません。,|-^._"[|\\b]foo[|\\b]""foo", "foo|bar|baz", "foo-bar", "baz foo|bar""foo_bar""foo2"

しかし、私の質問はまだ残っています:なぜ"[|\\b]foo[|\\b]"パターンが一致しないの"foo"ですか?

4

4 に答える 4

3

あなたが使用することができますstrplit

> "foo" %in% unlist(strsplit("foo|baz|bar", split = "|", fixed = TRUE))
[1] TRUE

ベクトル化できるもの:

> z <- c("foo|baz|bar", "foobaz|bar", "bazfoo")
> x <- c("foo", "foot")
> sapply(strsplit(z, split = "|", fixed = TRUE), function(x,y)y %in% x, x)
      [,1]  [,2]  [,3]
[1,]  TRUE FALSE FALSE
[2,] FALSE FALSE FALSE
于 2012-10-14T18:37:44.503 に答える
2

\b次の位置で一致します

  1. 文字列の最初の文字の前。最初の文字が単語文字の場合。
  2. 文字列の最後の文字の後、最後の文字が単語文字の場合。
  3. 文字列内の2つの文字の間。一方は単語文字で、もう一方は単語文字ではありません。(単語の文字はa-zA-Z1-9_です)

以来| 正規表現の交替演算子の略で、エスケープする必要があります。

したがって、正規表現\bfoo\bは一致fooしますfoo|bar。単語以外の文字です。文字セットを使用する必要はありません[\b\|]

編集:文字セット内の\ bの下でflodelが指摘したように、バックスペース文字を表します。したがって、|と一致します [\ b \ |]の内側であり、単語の境界ではありません。

于 2012-10-14T19:00:47.820 に答える
1

正規表現では特別な意味があるため|、エスケープする必要があります。つまり、次を使用します\\|

ptn <- "\\bfoo[\\|\\b]"

grep(ptn, "foo|baz|bar") 
[1] 1

grep(ptn, "foo")          
integer(0)
于 2012-10-14T18:40:36.207 に答える
0

これも機能します:

gregexpr("foo|", "foo|baz|bar", fixed = TRUE)[[c(1, 1)]] > 0
gregexpr("foo|", "foobaz|bar", fixed = TRUE)[[c(1, 1)]] > 0    
gregexpr("foo|", "bazfoo", fixed = TRUE)[[c(1, 1)]] > 0 

gregexprこのアプローチは、2つの単語で構成される単語を検索するために提供する間隔オプションを利用できるという点で異なります。

gregexpr("foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0 
gregexpr("  foo|", "baz foo|", fixed = TRUE)[[c(1, 1)]] > 0 
于 2012-10-14T18:50:17.260 に答える