2012-08-01 65 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

相关问题