2017-02-16 96 views
0

我正在嘗試編寫一個ant任務,用於刪除與正則表達式匹配的所有行。使用正則表達式的不可打印字符匹配

什麼,我現在在做什麼:

<replaceregexp byline="true" flags="g"> 
    <regexp pattern="import com.xyz.abc.123.*"/> 
    <substitution expression=""/> 
    <fileset dir="/my/custom/directory"> 
     <include name="*.java"/> 
    </fileset> 
</replaceregexp> 

這留下一個空行,不刪除它,這是可以理解我。但是當我修改正則表達式爲:

<replaceregexp byline="true" flags="g"> 
    <regexp pattern="import com.xyz.abc.123.*\\n"/> 
    <substitution expression=""/> 
    <fileset dir="/my/custom/directory"> 
     <include name="*.java"/> 
    </fileset> 
</replaceregexp> 

它甚至不匹配正則表達式。有關如何解決此問題的任何建議?

還有一個noob問題:當我使用這個正則表達式import com.xyz*它無法匹配模式,當前正則表達式匹配。 prefix*是否找到前綴爲prefix的模式?

PS:我不想運行另一個任務來刪除所有空行,因爲這會弄亂格式並刪除我想要的空行。

回答

1

您正在使用\\n換行,而您應該使用\n。這與UNIX換行符匹配。如果您有興趣去除換行符,無論是Windows還是UNIX,也可以使用\r?\n。確保不要使用國旗byline="true"。這將匹配一行的文本行,但不包括換行符:

<replaceregexp byline="false" flags="g"> 
    <regexp pattern="import com\.xyz\.abc\.123\r?\n"/> 

你可能已經看到,點字符.這裏逃脫。點字符表示正則表達式中的「每個字符」。因爲你實際上想在這裏匹配一個點,所以你需要轉義它。


*字符表示,即前述令牌(通常是一個字母)可以匹配0或大於0的時間(但貪婪)。在你的情況prefix*,下面的示例將匹配:

prefi 
prefix 
prefixxxxx 
prefixxxxxxxxx 

如果要組這個詞放在一起,你可以使用捕捉或非捕獲組:

(prefix)* -> capturing group 
(?:prefix)* -> non-capturing group 

我看見了,你已使用.*。當您禁用byline時,使用.*可能會很危險,因爲它匹配任何字符並且儘可能多(可能直到文件結尾)。爲了收集最少字符作爲可能以後還可以使用一個問號:.*?

如果您導入語句聲明的變量結束(但斷行結束),可以使用下面的正則表達式:

<regexp pattern="import com\.xyz\.abc\..*?\r?\n"/> 

這將匹配任何下列

import com.xyz.abc. [ line break ] 
import com.xyz.abc.a [ line break ] 
import com.xyz.abc.bc; [ line break ] 
import com.xyz.abc.def23fewvgsdvds;;;; [ line break ] 
+0

感謝的,我讀你的答案後的基本閱讀起來。我不知道點元字符的作用,並將其當作文字來對待。我有錯誤的知識點是文字把「*。java「裏面的文件集包括名稱,但它的工作。現在,我用<包含名稱=」。* \。java「/>來找到所有的Java文件,但這似乎並沒有工作。 – Learner