Regex 正则表达式查找注释和字符串之外的单词
我想制作一个脚本,将Fortran 90中源代码的关键字大写,为此我考虑使用正则表达式和Regex 正则表达式查找注释和字符串之外的单词,regex,Regex,我想制作一个脚本,将Fortran 90中源代码的关键字大写,为此我考虑使用正则表达式和sed(这可能是我的第一个错误:p)。不过,我还没有找到一个匹配项,它会丢弃注释中的单词(在我的代码中,是!之后的所有单词)和字符串中的单词(在单引号“…”或双引号“…”) 其思想是创建一个包含Fortran所有关键字(if、end if、subroutine、abs、allocate…)的列表,并将sed与此正则表达式一起使用。请告诉我如何做到这一点,以及这种方法是否正确,或者是否有更好的方法来实现我的目标
sed
(这可能是我的第一个错误:p)。不过,我还没有找到一个匹配项,它会丢弃注释中的单词(在我的代码中,是!
之后的所有单词)和字符串中的单词(在单引号“…”
或双引号“…”
)
其思想是创建一个包含Fortran所有关键字(if、end if、subroutine、abs、allocate…)的列表,并将sed与此正则表达式一起使用。请告诉我如何做到这一点,以及这种方法是否正确,或者是否有更好的方法来实现我的目标。这必须是可能的,因为编辑们以某种方式正确地强调了这句话。伙计,如果我能告诉Emacs“请大写蓝色单词!”:)当然有更好的方法,但我现在还不能说 因此,对于regex,您应该执行以下步骤:
如果字符串没有跨越几行,则可以每行执行以下步骤。我不知道sed,但使用Perl时,可以使用以下内容:
perl -p -E 's/(\'[^\']*\'|"[^"]*"|!.*)|\b(if|end|subroutine|abs|allocate)\b/$1\U$2/gi' file
(根据需要调整引号/注释表达式。)最后一位朋友为我找到了一个解决方案,不是使用regexps,而是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()
#/usr/bin/python
导入系统
进口稀土
如果(len(sys.argv)
此命令应大写关键字
警告:Emacs预计,当关键字没有按这种方式编写时,字体将丢失。仅供参考,您可能可以告诉Emacs这样做,这很好,但我没有让它完全工作。首先,可能我有一个旧的perl,但-E
选项不起作用;我尝试了-E
。单引号的条件不适用于ork,给了我一个错误(在查找匹配的“””时出现意外的EOF)。如果我将其删除,则效果相当好:)