Java 如何在正则表达式中执行此操作-代码基更改
我有一个完整的基于Java的代码库,其中的成员命名为:Java 如何在正则表达式中执行此操作-代码基更改,java,regex,Java,Regex,我有一个完整的基于Java的代码库,其中的成员命名为: String m_sFoo; Array m_arrKeepThings; 变量/对象名称包括表示成员的m前缀和匈牙利符号类型指示符 我正在寻找一种方法来执行一次代码重播到(例如,在上述情况下到): 当然还有很多其他的选择,但是我希望基于两个例子,我能够执行完整的更改。 性能不是一个问题,因为它是一个单一的时间修复 为了澄清这一点,如果我必须用文字解释的话,应该是: 匹配以m_[a-zA-Z]开头的单词 在m_______________
String m_sFoo;
Array m_arrKeepThings;
变量/对象名称包括表示成员的m
前缀和匈牙利符号类型指示符
我正在寻找一种方法来执行一次代码重播到(例如,在上述情况下到):
当然还有很多其他的选择,但是我希望基于两个例子,我能够执行完整的更改。
性能不是一个问题,因为它是一个单一的时间修复
为了澄清这一点,如果我必须用文字解释的话,应该是:
如果您真的非常确定建议的更改不会导致冲突(变量的前缀不同),我会使用一行perl:
perl -pi.bak -e "s/\bm_[a-z_]+([A-Z]\w*)\b/this.\u$1/g;" *.java
这将执行Java源代码的内联编辑,同时保留扩展名为.bak
的备份,在单词边界(\b
)之间替换模式,每行将替换的第一个字母(\u
)大写多次
然后,您可以在备份文件和结果文件之间进行比较,以查看是否一切正常。查看本文:
一般来说,我恐怕你不能用正则表达式改变字母的大小写。
我建议您实现一个简单的实用程序(使用您想要的任何语言)。你可以用java来做。只需浏览文件树,搜索类似于m[sidc]([A-Z])
的模式,获取捕获的序列,调用toLowerCase()并执行replace
另一种解决方案是搜索并替换
MUSA
,然后搜索并替换MUSB
m_sZ
使用eclipse。总数:26次。这有点愚蠢,但无论如何可能比实现和调试自己的代码要快。下面是一些有效的Java代码。它不是纯正则表达式,而是基于:
用法:
String str = "String m_sFoo;\n"
+ "Array m_arrKeepThings;\n"
+ "List<? extends Reader> m_lstReaders; // A silly comment\n"
+ "String.format(\"Hello World!\"); /* No m_named vars here */";
// Read the file you want to handle instead
NameMatcher nm = new NameMatcher(str);
System.out.println(nm.performReplacements());
演示输出:
String foo;
Array keepThings;
List<? extends Reader> readers; // A silly comment
String.format("Hello World!"); /* No m_named vars here */
stringfoo;
阵列保持;
列表为什么不使用IDE的重构功能?因为在3k文件中更改8k变量名对我来说太多了。我认为一个正则表达式是不够的,您可能需要了解AST来执行这些更改(取决于代码的复杂性)。步骤#1可能太笼统了,必须只能匹配arribute名称。谢谢。很快,我希望手动完成额外10%的工作,这是我需要帮助的第一块。(1+)嗯,也许是我学习一点perl的时候了,“瑞士陆军编程语言链锯”!等待注意。您可能应该将m_A替换为此。\u$1
。这将避免与局部变量的名称冲突。这非常接近,但在现实生活中,我在使用成员时也需要为其命名时遇到了问题,如:This.m_sFoo;可能还有其他匹配模式?那么,是否也要删除this.
部分?我认为这不是个好主意。我想我给你的代码应该很好用。
package so_6806699;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author martijn
*/
public class NameMatcher
{
private String input;
public static final String REGEX = "m_[a-z]+([A-Z0-9_\\$\\µ\\£]*)";
public static final Pattern PATTERN = Pattern.compile(REGEX);
public NameMatcher(String input)
{
this.input = input;
}
public String performReplacements()
{
Matcher m = PATTERN.matcher(input);
StringBuilder sb = new StringBuilder();
int oldEnd = 0;
while (m.find())
{
int start = m.start();
int end = m.end();
String match = input.substring(start, end);
String matchGroup1 = match.replaceAll(REGEX, "$1");
if (!matchGroup1.isEmpty())
{
char[] match_array = matchGroup1.toCharArray();
match_array[0] = Character.toLowerCase(match_array[0]);
match = new String(match_array);
}
sb.append(input.substring(oldEnd, start));
oldEnd = end;
sb.append(match);
}
sb.append(input.substring(oldEnd));
return sb.toString();
}
}
String foo;
Array keepThings;
List<? extends Reader> readers; // A silly comment
String.format("Hello World!"); /* No m_named vars here */