[英]Regex issue - Matching API name
我目前正在使用大型代碼庫,最近該API的簽名之一已更改。 因此,我需要修改數千個文件才能獲得新功能。 因此,開發了一個Java程序來獲取所有*.java
文件並查找舊的API模式。 如果找到,請用新模式替換它。
API(3,Utils.FIFTY,key1,key4)
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.