我正在尝试在MATLAB文件中提取注释。在MATLAB中,注释用%表示,所以明智的做法是搜索%.*
。但是,MATLAB还有像sprintf和fprintf这样的函数,允许像sprintf('x = %d', 5)
这样的东西,正则表达式也会找到%d', 5)
,这是我不想要的。当然,我也想忽略%s
或%f
等变体。有没有办法只捕获那些匹配%.*
但未包含在'
字符中的段?我想我应该澄清一下,我通常会尝试捕获以%
开头的注释,但忽略字符串文字中的任何%
。 sprintf只是我想忽略的一个例子。
我找到this question,这似乎是相关的,但没有解决方案可以解决我的问题。
答案 0 :(得分:2)
我的最终正则表达式:
- 的
^(^[^']+|[^']+('.*')+[^']+)?(;|,)\s*%(?<com>.*)|^(\s)*%(?<com2>.*)
强>
regexp('%i am a comment', '^(^[^'']+|[^'']+(''.*'')+[^'']+)?(;|,)\s*%(?<com>.*)|^(\s)*%(?<com2>.*)', 'names')
响应:
com2: 'i am a comment'
com: []
regexp('printf () ; %i am a comment after a command','^(^[^'']+|[^'']+(''.*'')+[^'']+)?(;|,)\s*%(?<com>.*)|^(\s)*%(?<com2>.*)', 'names')
响应:
com2: []
com: 'i am a comment after a command'
regexp('printf ('' % i m not a comment '') , %i am a comment after a command followed by comma', '^(^[^'']+|[^'']+(''.*'')+[^'']+)?(;|,)\s*%(?<com>.*)|^(\s)*%(?<com2>.*)', 'names')
响应:
com2: []
com: 'i am a comment after a command followed by comma'
这个案例是为了确保评论没有被抓住:
regexp('printf('' ;%i m not a comment '');', '^(^[^'']+|[^'']+(''.*'')+[^'']+)?(;|,)\s*%(?<com>.*)|^(\s)*%(?<com2>.*)', 'names')
ans =
0x0 struct array with fields:
com2
com
评论存储在变量com
和com2
答案 1 :(得分:1)
这并不符合问题的要求,但我认为无论如何我都会分享它。
如果可以访问MATLAB,那么您可以使用publish
函数,然后使用grep
提取注释。
所以对于myfun.m
function [out] = myfun(n)
% Comment
out = ['% Not a ',... this is a comment too
'comment'];
fprintf('%d',n)%do this
%{
Multiline
comment
%}
我们运行
publish('myfun.m')
生成文件html/myfun.html
。现在用例如bash,我们可以运行
egrep -o -e "<span class=\"comment\">.*?</span>" html/myfun.html
返回
<span class="comment">% Comment</span>
<span class="comment"> this is a comment too</span>
<span class="comment">%do this</span>
<span class="comment">%}</span>
这不完全存在,因为publish
有像这样的分割线
<span class="comment">%{
</span><span class="comment"> Multiline
</span><span class="comment"> comment, n>2
</span><span class="comment">%}</span>