2012-08-01 64 views
3

我想獲得一個字符串內的空白位置,但我不明白結果。r正則表達式奇怪的行爲

鑑於字符串:

一個= 「12345,1300英里」

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

這是有意義的B/C的白色空間爲在所述串的索引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 

這對我也沒有意義b/c空格匹配字符串中的每個單個字符。

+0

請提供準確的標題 – mdsumner 2012-08-02 00:13:16

回答

3

裏面的字符類你可能不應該使用轉義的正則表達式序列。他們沒有被正確識別。我不知道這是否是正確的正則表達式的行爲,但在?regex頁面話說了一句:「大多數的元字符失去一個字符類中的特殊含義。」我可以成功地使用[:space:]代替

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

在第二種情況的確如此,所有這些子字符串都符合該模式。這段代碼的行爲也許是你所期望的:

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 
2

我可以解釋你爲\s*時的行爲。量詞*匹配0次或更多次。這0意味着它,如果它沒有找到一個空白匹配:

12345,1300英里

你的正則表達式\s*看到的第一個字符「1」 ==>有沒有\s,所以它匹配0次出現,意味着它MATCHES長度爲0

然後,它前進到第二字符「2」 ==>沒有\s,所以它匹配0次出現,意味着它MATCHES長度爲0

在第三個字符....

此正則表達式不匹配「字符串在每一個字符」它那些字符之間的空字符串匹配。

+0

我明白了,謝謝! – Paolo 2012-08-01 21:29:49

相關問題