我正在尝试获取字符串中的空格位置,但我不明白结果。
给出字符串:
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
这对我来说也没有意义b / c白色空间匹配字符串中的每个字符。
答案 0 :(得分:3)
在内部字符类中,您可能不应该使用转义的正则表达式序列。他们没有被正确识别。我不知道这是否是正确的正则表达式行为,但?regex
页面中有一句话说:“大多数元字符在字符类中失去了特殊含义。”我可以成功使用[:space:]
代替< / p>
> 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
答案 1 :(得分:2)
我可以向您解释\s*
案例的行为。量词*
匹配0次或更多次出现。如果它没有找到空格,则0表示匹配:
12345,1300英里
你的正则表达式\s*
看到第一个字符“1”==&gt;没有\s
,因此匹配0次出现,意味着匹配,长度为0
然后继续第二个字符“2”==&gt;没有\s
,因此匹配0次出现,意味着匹配,长度为0
关于第三个角色......
此正则表达式与“字符串中的每个字符”不匹配,它与这些字符之间的空字符串匹配。