使用正则表达式使用%,ingore printf和%d查找注释

时间:2015-10-01 17:24:47

标签: regex matlab

我正在尝试在MATLAB文件中提取注释。在MATLAB中,注释用%表示,所以明智的做法是搜索%.*。但是,MATLAB还有像sprintf和fprintf这样的函数,允许像sprintf('x = %d', 5)这样的东西,正则表达式也会找到%d', 5),这是我不想要的。当然,我也想忽略%s%f等变体。有没有办法只捕获那些匹配%.*但未包含在'字符中的段?我想我应该澄清一下,我通常会尝试捕获以%开头的注释,但忽略字符串文字中的任何%。 sprintf只是我想忽略的一个例子。

我找到this question,这似乎是相关的,但没有解决方案可以解决我的问题。

2 个答案:

答案 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

评论存储在变量comcom2

答案 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&gt;2
</span><span class="comment">%}</span>

这需要How can I search for a multiline pattern in a file?