用正则表达式重新格式化代码

2024-06-01 00:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我们在几个类中有一个ArrayList项,每次我想在列表中插入一个新项时,都会给我带来麻烦。以我的方式设计类是我的一个错误,但是现在改变设计会比它的价值更令人头疼(官僚瀑布模型)。我应该预料到客户提供给我们的文档的格式会发生变化。在

我想用python编写一个简单的脚本,将该项添加到一个类中,将该项添加到列表中,然后递增以下项的所有检索值。这听起来不是很能解释:

Foo extends Bar{
    public Foo(){
        m_Tags.add("Jane");
        m_Tags.add("Bob");
        m_Tags.add("Jim");
    }

    public String GetJane() { return m_ParsedValue.get( m_Tags.get(1) ); }
    public String GetBob() { return m_ParsedValue.get( m_Tags.get(2) ); }
    public String GetJim() { return m_ParsedValue.get( m_Tags.get(3) ); }
}

你看,如果我想在“Jane”和“Bob”之间加一个值,那么我必须增加Get*函数中的整数。我只想用Python编写一个简单的脚本来完成这项工作。我非常尊敬的人建议使用regex。在

编辑:

是的,LinkedHashMap。如此简单,如此简单,如此不在设计规范中。我讨厌瀑布。带着激情去恨它。这整件事是一个“小”和“容易”的部分,“不应该花太多时间去设计。”我犯了错误。它现在卡在石头上了。在


Tags: 脚本add列表getstringreturnfoo错误
3条回答

您希望正则表达式与编译器在标记之间的空白方面一样灵活。这样做并模仿空白的用法会使模式变得相当混乱。下面的代码(抱歉:Perl,而不是Python)在适当的地方编辑源文件。在

#! /usr/bin/perl -i.bak    
use warnings;
use strict;
my $template =
  '^( public
      String
      Get)(\w+)( \( \) { return
        m_ParsedValue . get \( m_Tags . get \( )(\d+)( \) \) ; } )$';
$template =~ s/ +/\\s*/g;
$template =~ s/(\r?\n)+/\\s+/g;
my $getter = qr/$template/x;

die "Usage: $0 after new-name source ..\n" unless @ARGV >= 3;
my $after = shift;
my $add   = shift;
my $index;
while (<>) {
  unless (/$getter/) {
    print;
    next;
  }
  my($abc,$name,$lmno,$i,$xyz) = ($1,$2,$3,$4,$5);
  if (defined $index) {
    print join "" => $abc, $name, $lmno, ++$index, $xyz;
  }
  else {
    if ($name eq $after) {
      $index = $i;
      print; print join "" => $abc, $add, $lmno, ++$index, $xyz;
    }
    else { print; }
  }
}

例如

^{pr2}$

不要用regexp这样做。创建将名称映射到数字的符号常量(例如使用枚举)。在

除了对不良实践的评论-这里是你用你要求的语言要求的代码。 如果您以这种方式保存系统,最好的方法可能是让这些java文件在构建过程中自动生成——您只需在目录中的.txt文件中保存一个名称列表。这个脚本适合这样做。在

(它不会修改你的文件,它会根据你在这里发布的模板生成新文件)

import re, sys

template = """Foo extends Bar{
    public Foo(){
%s
    }

%s
}
"""

tag_templ =   """        m_Tags.add("%s");"""
getter_templ = """    public String GetJane() { return m_ParsedValue.get( m_Tags.get(%d) ); }"""

def parse_names(filename):
    data = open(filename).read()
    names = re.findall(r'm_Tags\.add\("(.*?)"', data)
    return names

def create_file(filename, names):
    tag_lines = [tag_templ % name for name in names]
    getter_lines = [getter_templ % (i + 1) for i in range(len(names))]
    code = template % ("\n".join(tag_lines), "\n".join(getter_lines))
    file = open(filename,"wt")
    file.write(code)
    file.close()

def insert_name(after, new_name, names):
    names.insert(names.index(after) + 1, new_name)

if __name__ == "__main__":
    if len(sys.argv ) < 4:
        sys.stderr.write("Usage: changer.py <filename> <name-before-insertion> <new-name>")
        sys.exit(1)
    filename, name_before, new_name = sys.argv[1:]
    names = parse_names(filename)
    insert_name(name_before, new_name, names)
    create_file(filename, names)

相关问题 更多 >