新手问题 菜鸟在这里请教一个正则表达式 (贪婪匹配) 的问题,实际结果跟我想预期不同,思考了很久也找不到原因,请高人解惑。

shixukai · 2015年07月10日 · 最后由 w7938940 回复于 2015年07月10日 · 1699 次阅读
str = "     shssskkkk "
r1 = %r|([^\s]*)|
r1 =~ str
$1

这样得出的结果为什么是空而不是"shssskkkk "? 如果表达式是

r1 = %r|([^\s])|

这样的话结果是“s” 我想根据贪婪匹配的原则加“*”应该是后面全部匹配才对。

换成([^\s]+)看看

#1 楼 @ywjno 换成 ([^\s]+) 结果是正常的“shssskkkk”

因为你给的正则匹配空字符串,而第一个空字符串在第一个空格之前

你可以看看所有的匹配都是什么:str.scan(r1).to_a

#3 楼 @luikore 明白了,十分感谢

#3 楼 @luikore 不好意思,我想错了,我的表达式应该是匹配非空字符串的意思呀。([^\s]) 的结果是“s”,但 ([^\s]*) 后就变成空了

#5 楼 @shixukai 我们说的 "空" 的意思不一样

你说的是由空格组成的字符串... 我说的空字符串是长度为 0 的字符串

然后 * 是可以匹配长度为 0 的字符串的

a* Zero or more of a a+ One or more of a

空字符串应该匹配零个或多个非空字符

需要 登录 后方可回复, 如果你还没有账号请 注册新账号