正则表达式奇怪的行为

时间:2012-08-01 20:08:43

标签: regex r

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

给出字符串:

  

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白色空间匹配字符串中的每个字符。

2 个答案:

答案 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

关于第三个角色......

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