我们在几个课程中有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中编写一个简单的脚本来完成我的工作。有人非常尊重建议的正则表达式。
编辑:
是,LinkedHashMap。如此简单,如此简单,所以现在不在设计规范中。我讨厌瀑布。讨厌它。整个过程是一个“小”和“简单”的部分,“不应该花费太多时间来设计”。我犯了错误。它现在陷入困境。
答案 0 :(得分:4)
请勿使用regexp执行此操作。创建将名称映射到数字的符号常量(例如使用枚举)。
答案 1 :(得分:4)
您希望正则表达式与编译器在令牌之间的空格方面一样灵活。这样做并模仿空白使用会使模式非常混乱。下面的代码(抱歉: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; }
}
}
例如,
$ ./add-after Jane Foo code.java $ cat code.java 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 GetFoo() { return m_ParsedValue.get( m_Tags.get(2) ); } public String GetBob() { return m_ParsedValue.get( m_Tags.get(3) ); } public String GetJim() { return m_ParsedValue.get( m_Tags.get(4) ); } }
答案 2 :(得分:4)
关于不良做法的评论 - 这是您用所要求的语言提出的代码。 如果以这种方式保持系统,最好的办法可能是在构建过程中自动生成这些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)
答案 3 :(得分:0)
我正在做这个(好吧,非常相似),但是使用Excel和VBA宏。所有业务价值都在电子表格中进行组织和排序。我只需要单击一个按钮为所选单元格生成适当的代码,然后复制粘贴到IDE。更好的是,我每行都有几个“代码列”。其中一些生成查询,一些XSL转换和一些过程。对于一行业务数据,我可以非常轻松地获得所有三种类型的生成代码。
我发现这(重新生成)比重新格式化现有代码要容易得多。