首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex问题-匹配API名称

Regex问题-匹配API名称
EN

Stack Overflow用户
提问于 2013-02-20 18:53:22
回答 3查看 497关注 0票数 2

我目前正在使用一个大型代码库,其中一个API的签名最近发生了变化。因此,我需要修改成千上万的文件,以获得新的功能。因此开发了一个java程序来获取所有的*.java文件并寻找旧的API模式。如果找到,就用新的模式替换它。

旧API

代码语言:javascript
复制
API(3,Utils.FIFTY,key1,key4)

新API

代码语言:javascript
复制
API(key1,key4)

因此,我创建了一个regex模式,以便将旧API与API\([\d,\s\.\w]*(key[\.\w\s,]*)\)匹配,如果匹配,则将其替换为

replaceString = matcher.group(1) + "(" + matcher.group(2) + ")";

因此,使用当前代码而不是预期的API(key1,key4),我将得到API(key4)。我分析了这个问题,我的推论是\w捕获了第一个模式。如果我们需要匹配,我们需要做一个负面的展望未来。

有谁能分享解决regex问题的最佳一致方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-20 19:00:12

下面这样的东西应该能起作用:

代码语言:javascript
复制
API\([\.\w \t,]*?,\s*(key[\.\w \t,]*)\)

这里的主要更改是将第一个字符类的重复从*更改为*?,这意味着它现在将匹配尽可能少的字符,而不是尽可能多的字符,因此您的所有key参数都将包含在匹配组中。

票数 1
EN

Stack Overflow用户

发布于 2013-02-20 19:22:30

F.J.的回答与这个测试案例不符:

代码语言:javascript
复制
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class APIUpdater {
   public static void main( String[] args ) {
      String source = "\n" +
        "API( key.getValue( 18 ),call( key1 ).mth(),key1,key4);\n" +
        "API(\n" +
        "\t3,\n" +
        "\tUtils.FIFTY,\n" +
        "\tkey1,\n" +
        "\tkey4 );\n" +
        "API(3,Utils.FIFTY,key1,key4);\n";
      Pattern p =
         Pattern.compile( "API\\([.\\w\\s,]*?,\\s*(key[\\.\\w\\s,]*)\\)" );
      Matcher m = p.matcher( source );
      while( m.find())
      {
         System.err.println( m.replaceAll( "API(key1,key4)" ));
      }
   }
}

产出如下:

代码语言:javascript
复制
API( key.getValue( 18 ),call( key1 ).mth(),key1,key4);
API(key1,key4);
API(key1,key4);

几行上的调用不匹配,但空格被正确处理。

解析Java需要一个真正的语法分析器,正则表达式不能完成这个复杂的工作,因为它们在词法级别(单词而不是句子)工作。

票数 2
EN

Stack Overflow用户

发布于 2013-02-20 19:43:26

您可能需要尝试记录器,它允许您应用源代码转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14987735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档