Java 如何在正则表达式中执行此操作-代码基更改

Java 如何在正则表达式中执行此操作-代码基更改,java,regex,Java,Regex,我有一个完整的基于Java的代码库,其中的成员命名为: String m_sFoo; Array m_arrKeepThings; 变量/对象名称包括表示成员的m前缀和匈牙利符号类型指示符 我正在寻找一种方法来执行一次代码重播到(例如,在上述情况下到): 当然还有很多其他的选择,但是我希望基于两个例子,我能够执行完整的更改。 性能不是一个问题,因为它是一个单一的时间修复 为了澄清这一点,如果我必须用文字解释的话,应该是: 匹配以m_[a-zA-Z]开头的单词 在m_______________

我有一个完整的基于Java的代码库,其中的成员命名为:

String m_sFoo;
Array m_arrKeepThings;
变量/对象名称包括表示成员的
m
前缀和匈牙利符号类型指示符

我正在寻找一种方法来执行一次代码重播到(例如,在上述情况下到):

当然还有很多其他的选择,但是我希望基于两个例子,我能够执行完整的更改。 性能不是一个问题,因为它是一个单一的时间修复

为了澄清这一点,如果我必须用文字解释的话,应该是:

  • 匹配以m_[a-zA-Z]开头的单词
  • 在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 */