正则表达式在注释和字符串之外找到单词

时间:2012-08-20 07:38:55

标签: regex

我想创建一个脚本,在Fortran 90中大写我的源代码的关键字,我考虑使用正则表达式和sed(这可能是我的第一个错误:P)。但是,我没有设法让匹配丢弃评论中的字词(在我的代码中,!之后的所有内容)和字符串(单个'...'之间的所有内容或双引号"..."

这个想法是有一个包含Fortran所有关键字的列表(if,end if,subroutine,abs,allocate ...)并使用sed和这个正则表达式。请告诉我如何做到这一点,以及这种方法是否正确或有更好的方法来实现我想要的。它必须是可能的,因为编辑正确地突出了这个词。伙计,如果我能告诉Emacs“请把蓝字说出来!” :)

4 个答案:

答案 0 :(得分:0)

肯定有更好的方法,但目前我无法告诉你

所以使用正则表达式,你应该采取以下步骤:

  1. 删除评论和字符串;将它们存放在任何地方
  2. 搜索关键字并执行您想要的任何突出显示
  3. 重置已删除的字符串和注释
  4. 重置你可以用你存储它们的数组的索引替换它们

    如果您的字符串没有超过几行,您可以按行每行进行

答案 1 :(得分:0)

不了解sed,但使用Perl你可以使用类似的东西:

perl -p -E 's/(\'[^\']*\'|"[^"]*"|!.*)|\b(if|end|subroutine|abs|allocate)\b/$1\U$2/gi' file

(根据需要调整引用/评论表达。)

答案 2 :(得分:0)

最后一位朋友为我找到了一个解决方案,不是使用正则表达式而是使用python。我在这里分享,以防其他人面临这个问题。这是python代码;它需要两个参数:输入和输出文件。

#!/usr/bin/python

import sys
import re

if (len(sys.argv)<3):
  print "Try with two arguments."
  sys.exit()

FILEIN  = sys.argv[1]
FILEOUT = sys.argv[2]

substitutions = {                                    \
            "call":"CALL"                           ,\
            "parameter":"PARAMETER"                 ,\
            "allocatable":"ALLOCATABLE"             ,\
            "dimension":"DIMENSION"                 ,\
            "integer":"INTEGER"                     ,\
            "logical":"LOGICAL"                     ,\
            "double precision":"DOUBLE PRECISION"    \
            }

patterns = []
for s in substitutions:
  patterns.append(["(^[^!]*)\\b%s\\b"%s,"\\1%s"%substitutions[s]])
  patterns.append(['("[^"]*)\\b%s\\b([^"]*")'%substitutions[s],"\\1%s\\2"%s])
  patterns.append(["('[^']*)\\b%s\\b([^']*')"%substitutions[s],"\\1%s\\2"%s])
  patterns.append(["(\([^\)]*)\\b%s\\b([^\)]*\))"%substitutions[s],"\\1%s\\2"%s])

retList = []
f = open(FILEIN,"r")
for line in f:
  for p in patterns:
    prevLine=""
    nextLine="1"
    while (prevLine!=nextLine):
      nextLine = re.sub(p[0],p[1],line)
      prevLine = line
      line = nextLine
  retList.append(line)
f.close()

f = open(FILEOUT,"w")
f.write(''.join(retList))
f.close()

答案 3 :(得分:0)

https://gist.github.com/3414783

此命令应该将关键字大写

警告:当关键字没有写出来的时候,Emacs预计会失去忠诚。