在正则表达式替换期间调用函数

时间:2015-02-04 17:04:00

标签: regex matlab

我需要解码来自json的字符串。特殊字符被编码为十六进制unicode(例如撇号是/ u0027)。 我试图用这些表达来实现这个目标:

regexprep('Can/u0027t add the category','/u(\d{4})',native2unicode(hex2dec(strrep('$1','/u',''))))

但是我收到以下错误

Error using hex2dec (line 38)
Input string found with characters other than 0-9, a-f, or A-F.

因为hex2dec收到' $ 1'作为价值,而不是strrep的结果(' $ 1',' / u','')。 如果我试试

regexprep('Can/u0027t add the category','/u(\d{4})',strrep('$1','/u',''))

我正确地得到了' Can0027t添加类别'。如果我尝试

regexprep('Can/u0027t add the category','/u(\d{4})',native2unicode(hex2dec(strrep('/u0027','/u',''))))

我得到了正确的结果(但显然有一个固定的解码)。 我不明白为什么strrep的结果不是hex2dec的输入参数。

1 个答案:

答案 0 :(得分:1)

你在试图调试自己。替换字符串中的$1扩展对字符串本身进行操作,如regexprep所示。在调用任何函数之前,它不会被MATLAB解析器扩展,只会看到字符串'$1'。如果这些函数的结果包含$1,它将被传递到regexprep并进行扩展。因此,例如,您的裸strrep测试用例不会替换任何内容(因为它的输入是字符串'$1'),并将裸$1字符串直接传递回regexprep。

你有两个问题。一个很简单:你根本不需要strrep,因为括号只标记十六进制数字作为标记。 $1展开时没有/u。测试一下:

regexprep('Can/u0027t add the category','/u(\d{4})','$1')

导致'Can0027t添加类别'。

现在为更难的人。如前所述,您无法在$1上调用正常函数并让它们执行任何操作。但是,MATLAB提供了一种特殊的正则表达式语法来从里面调用替换字符串中的函数。这是文档:

http://www.mathworks.com/help/matlab/matlab_prog/dynamic-regular-expressions.html

总之,${cmd($1)}扩展为在替换令牌上调用MATLAB函数cmd以生成替换字符串。所以把它们放在一起:

regexprep('Can/u0027t add the category', '/u(\d{4})', '${native2unicode(hex2dec($1))}')

ans =无法添加类别