簡體   English   中英

正則表達式問題-匹配的API名稱

[英]Regex issue - Matching API name

我目前正在使用大型代碼庫,最近該API的簽名之一已更改。 因此,我需要修改數千個文件才能獲得新功能。 因此,開發了一個Java程序來獲取所有*.java文件並查找舊的API模式。 如果找到,請用新模式替換它。

舊API

API(3,Utils.FIFTY,key1,key4)

新API

API(key1,key4)

因此,我創建了一個正則表達式模式以將舊API匹配為API\\([\\d,\\s\\.\\w]*(key[\\.\\w\\s,]*)\\)如果匹配,它將替換為

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

因此,使用當前代碼而不是預期的API(key1,key4) ,我正在獲取API(key4) 我已經分析了問題,並且推斷\\w抓住了第一個模式。 如果我們需要匹配,我們需要做一個負面的展望。

誰能分享解決正則表達式問題的最佳一致方法?

FJ的答案與此測試用例不符:

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)" ));
      }
   }
}

輸出為:

API( key.getValue( 18 ),call( key1 ).mth(),key1,key4);
API(key1,key4);
API(key1,key4);

多行呼叫不匹配,但空格已正確處理。

解析Java需要具有語法的真正解析器,正則表達式不能完成這項復雜的工作,因為它們在詞法級別(單詞,而不是句子)起作用。

類似於以下內容的東西應該起作用:

API\([\.\w \t,]*?,\s*(key[\.\w \t,]*)\)

這里的主要更改是將第一個字符類的重復次數從*更改為*? ,這意味着它現在將匹配盡可能少的字符,而不是盡可能多的字符,因此所有key參數都將包含在匹配組中。

您可能需要嘗試Recoder ,它允許您應用源代碼轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM