【问题标题】:r regex weird behaviorr 正则表达式奇怪的行为
【发布时间】:2012-08-01 20:08:42
【问题描述】:

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

给定字符串:

a = "12345,1300 英里"

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

这是有道理的,因为空格在字符串的索引 11 中。

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

这对我来说没有意义 b/c index 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

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

【问题讨论】:

  • 请提供准确的标题

标签: regex r


【解决方案1】:

在字符类中,您可能不应该使用转义的正则表达式序列。他们没有被正确识别。我不知道这是否是正确的正则表达式行为,但?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次,意味着它匹配长度为0

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

    在第三个字符上......

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

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2013-07-13
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多