3

我正在尝试获取字符串中空格的位置,但我不明白结果。

给定字符串:

a = "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

这对我来说也没有意义,因为空格匹配字符串中的每个字符。

4

2 回答 2

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
于 2012-08-01T20:24:54.480 回答
2

我可以向您解释\s*此案的行为。量词*匹配 0 次或多次出现。这个 0 表示如果没有找到空格则匹配:

12345,1300 英里

您的正则表达式\s*看到第一个字符 "1" ==> 没有\s,所以它匹配 0 次出现,意味着它匹配长度为 0

然后它继续到第二个字符 "2" ==> 没有\s,所以它匹配 0 次出现,意味着它匹配长度为 0

在第三个字符....

此正则表达式不匹配“字符串中的每个字符”,它匹配这些字符之间的空字符串。

于 2012-08-01T20:38:21.227 回答