我正在使用R语言,以下是我的字符串:
s <- "\t\t\t \t\t\thello world ! \t\t\thello"
我想获取字符串开头空格的匹配数,不包括其他位置的空格。因此,应该忽略内容之间的空格,仅计算开头的空格数量。在这里结果将是 "9"。
我尝试了以下代码,但只返回了一个计数器为"1"的结果...
sapply(regmatches(s, gregexpr('^(\\s)', s)), length)
我不太擅长正则表达式,需要帮助。
regexpr()
比gregexpr()
更合适。在进行这个切换后,sapply()
不再必要,因为regexpr()
返回一个原子向量,而gregexpr()
返回一个列表。regexpr()
结果的match.length属性。attr(regexpr("^\\s+", s), "match.length")
# [1] 9
正则表达式的解释:
^
强制正则表达式匹配字符串的开头。\\s
匹配空格字符:制表符、换行符、垂直制表符、换页符、回车符和空格。+
前面的模式将被匹配一次或多次。参考资料: http://en.wikibooks.org/wiki/R_Programming/Text_Processing
另一种解决方法是使用\G
进行锚定。 \G
功能是一个锚点,可以在两个位置之一匹配; 字符串的开头或上次匹配的最后一个字符被消耗的点。
sapply(gregexpr("\\G\\s", s, perl = TRUE), length)
# [1] 9
> sapply(gregexpr("[^\\h].*(*SKIP)(*F)|\\h", s, perl = TRUE), length)
[1] 9
> sapply(gregexpr("\\S.*(*SKIP)(*F)|\\h", s, perl = TRUE), length)
[1] 9
\\h
匹配横向空格。\S
匹配非空格字符,.*
匹配该非空格字符后面的所有字符直到行尾。 (*SKIP)(*F)
让匹配失败。并且紧接着 |
旁边的部分,也就是 \h
匹配所有剩余的横向空格(即在开头存在的空格)。
attr(regexpr("^\\s+",s),"match.length")
也可以运行。 - thelatemail\\t
被识别为普通空格?我不知道这一点。 - Rich Scriven"^\\s+"
改为"^\\h+"
,因为^\\s+
会计算在开头出现的换行符。我认为 op 的意思是只有水平空格而不是垂直空格。 - Avinash Raj\n
、\r
、\f
。 - Avinash Raj