Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式查找注释和字符串之外的单词_Regex - Fatal编程技术网

Regex 正则表达式查找注释和字符串之外的单词

Regex 正则表达式查找注释和字符串之外的单词,regex,Regex,我想制作一个脚本,将Fortran 90中源代码的关键字大写,为此我考虑使用正则表达式和sed(这可能是我的第一个错误:p)。不过,我还没有找到一个匹配项,它会丢弃注释中的单词(在我的代码中,是!之后的所有单词)和字符串中的单词(在单引号“…”或双引号“…”) 其思想是创建一个包含Fortran所有关键字(if、end if、subroutine、abs、allocate…)的列表,并将sed与此正则表达式一起使用。请告诉我如何做到这一点,以及这种方法是否正确,或者是否有更好的方法来实现我的目标

我想制作一个脚本,将Fortran 90中源代码的关键字大写,为此我考虑使用正则表达式和
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)。如果我将其删除,则效果相当好:)