Hackerrank中grep命令执行结果与本地Bash不一致原因问询
Hackerrank Shell题grep执行结果不一致问题解答
环境差异说明
Hackerrank的Shell运行环境和本地GNU/Linux Bash环境确实存在差异,核心差异点如下:
- 工具链版本差异:Hackerrank的Shell题型默认使用的GNU grep版本为3.1,和多数新版GNU/Linux发行版自带的grep 3.7+版本存在语法支持差异;部分早期上线的Shell题会调用BSD grep工具链,对POSIX正则的扩展特性支持不完全,比如
[[:space:]]字符类在ERE模式下的零宽匹配逻辑和GNU grep有明显区别。 - 输入预处理差异:Hackerrank平台会自动对测试输入做标准化处理,默认会把制表符替换为半角空格、裁剪行尾多余空白符,和你本地测试用的原始输入文件可能存在隐性的格式差异。
- 提交规则限制:本次涉及的grep考点题明确要求提交内容为正则表达式参数,不需要写完整的
grep -E前缀,如果你直接提交完整命令,平台会把整条命令当作正则参数传入默认的grep调用,自然会得到错误结果。
结果不一致的核心原因
你编写的正则([0-9])([[:space:]]*)\1本身逻辑是匹配两个相同数字中间存在0个或多个空白字符,存在两个不符合要求的问题:
- 若你提交了完整的
grep -E 'xxx'命令,不符合平台提交规则,会直接触发执行错误。 - 题意要求匹配的是相邻或者仅间隔1个空格的重复数字,你使用的
*量词会匹配中间存在多个空格的情况,不符合测试用例的判定规则,会触发匹配错误。
修复方案
如果平台要求提交完整grep命令,可使用如下写法:
grep -E '([0-9])\s?\1'
如果平台要求仅提交正则参数,直接提交([0-9])\s?\1即可。
内容的提问来源于stack exchange,提问作者Ayoub_Prog
相关产品推荐
相关产品推荐

