【发布时间】:2015-03-23 17:48:16
【问题描述】:
有人能解释一下 MATLAB 在正则表达式中使用 nul 字节 (x00) 做什么吗?
例子:
>> regexp(char([0 0 0 0 0 0 0 1 0 0 10 0 0 0]),char([0 0 0 0 46 0 0 10]))
ans =
1 % current
4 % expected
>> regexp(char([0 0 0 1 0 0 0 1 0 0 10 0 0 0]),char([1 0 0 0 46 0 0 10]))
ans =
4 % current
4 % expected
>> regexp(char([0 0 0 1 0 0 0 1 0 0 10 0 0 0]),char([0 0 0 0 46 0 0 10]))
ans =
[] % current
[] % expected
>> regexp(char([0 0 0 0 10 0 0 1 0 0 10 0 0 0]),char([0 0 0 0 46 0 0 10]))
ans =
1 % current
[] % expected
>> regexp(char([0 0 0 0 0 0 0 1 0 0 10 0 0 0]),char([1 0 0 0 46 0 0 10]))
ans =
[] % current
[] % expected
答案可能很简单,MATLAB 正则表达式并不意味着处理不可打印的字符,但如果是这种情况,我会认为它会出错。
编辑:46 应该是'.',就像在正则表达式通配符中一样。
EDIT2:
>> regexp(char([0 0 0 0 50 0 0 100 0 0 90 0 0 0]),char([0 0 46 0 0 90]))
ans =
1 9
我意识到它可能是 10 作为一个特殊字符,所以这个字符只有可打印和 nul 字节。我希望这个只匹配 9,因为第五个字符 50 不匹配 0。
【问题讨论】:
-
为什么您希望您的第一个示例返回
4而您的第四个示例返回[]?它们对我来说似乎很有意义。在第一种情况下,模式NUL NUL NUL NUL . NUL NUL将匹配字符串开头的NUL NUL NUL NUL NUL NUL NUL。 -
似乎在正则表达式模式前加上
0 46 0将导致模式中任何后续字符的自动匹配,无论它们是什么:regexp(char([0 0 0 1 2 3 4]),char([0 46 0 11 22 33 44])) -
你在使用 Matlab 的什么
version?我无法在 R2015b 中复制它,但我可以在 R2015a 中复制。似乎它可能是一个已修复的错误。 -
@horschler 我也一样!使用 8.6.0.267246 (R2015b) 我得到了预期的结果,而 R2015a 给了我奇怪的结果。