3

文字列内の空白の場所を取得しようとしていますが、結果がわかりません。

与えられた文字列:

a="12345,1300マイル"

> gregexpr("\\s", a)
[[1]]
[1] 11
attr(,"match.length")
[1] 1

これは、空白が文字列のインデックス11にある場合に意味があります。

> gregexpr("[\\s]", a)
[[1]]
[1] 16
attr(,"match.length")
[1] 1

これは私には意味がありません。b/cインデックス16は単に文字列の終わりです。そこには空白がなく、なぜインデックス11をスキップしたのか疑問に思います。

私は困惑しています、なぜこれが起こっているのか誰かが説明できますか?

> gregexpr("\\s*", a)
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
attr(,"match.length")
 [1] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0

これは、文字列内のすべての文字に空白が一致していることにも意味がありません。

4

2 に答える 2

3

文字クラス内では、エスケープされた正規表現シーケンスを使用しないでください。それらは正しく認識されません。これが適切な正規表現の動作であるかどうかはわかりませんが、?regexページに「ほとんどのメタ文字は文字クラス内で特別な意味を失います」という文があります。[:space:]代わりに正常に使用できます。

> grep("[\\s]", "ttt rrr a vvv")
integer(0)
> grep("[[:space:]]", "ttt rrr a vvv")
[1] 1

2番目の例では、これらのサブストリングのすべてがそのパターンに一致することは事実です。このコードの動作は、おそらくあなたが期待したものです:

gregexpr("\\s.*", a)
[[1]]
[1] 11
attr(,"match.length")
[1] 6
attr(,"useBytes")
[1] TRUE

または:

gregexpr("\\s+", a)
[[1]]
[1] 11
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE
于 2012-08-01T20:24:54.480 に答える
2

\s*事件の振る舞いを説明できます。数量詞*は0回以上のオカレンスに一致します。この0は、空白が見つからない場合に一致することを意味します。

12345,1300マイル

正規表現\s*には最初の文字「1」が表示されます==>はありません\s。したがって、0回の出現に一致します。つまり、長さ0で一致します。

次に、2番目の文字「2」に進みます==>はありません\s。したがって、0回の出現に一致します。つまり、長さ0で一致します。

3番目の文字について...。

この正規表現は、「文字列内のすべての文字」とは一致しません。これらの文字間の空の文字列と一致します。

于 2012-08-01T20:38:21.227 に答える