我正在尝试编写一个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>
它甚至不匹配正则。关于如何攻击这个问题有什么建议吗?
另外一个菜鸟问题:当我使用此正则 import com.xyz*
时,它无法匹配模式,当前的正则是匹配的。prefix*
是否以prefix
的前缀找到图案?
ps:我不想运行另一个任务以删除所有空线,因为这会弄乱格式化并会删除我想要的空线。
您正在使用\n
进行换行,而应该使用n
。这与Unix线路断开相匹配。如果您有兴趣删除线路断路,无论是Windows还是Unix,也可以使用r?n
。确保不使用标志byline="true"
。这将逐行与您的文本匹配,但不包括线路断开:
<replaceregexp byline="false" flags="g">
<regexp pattern="import com.xyz.abc.123r?n"/>
您可能已经看到,点字符.
在这里逃脱了。点字符在正则是"每个角色"。因为您实际上想在这里匹配一个点,所以您需要逃脱它。
*
字符说,上述令牌(通常一个字母)可以匹配0次或大于0次(但贪婪)。在您的情况下,prefix*
,以下样本将匹配:
prefi
prefix
prefixxxxx
prefixxxxxxxxx
如果您想将此术语分组在一起,则可以使用捕获或非捕获组:
(prefix)* -> capturing group
(?:prefix)* -> non-capturing group
我看到了,您已经使用了.*
。当您停用byline
时,使用.*
可能是危险的,因为它匹配任何字符和尽可能多的字符(可能直到文件末尾)。要收集最少的角色,您可以在此之后使用问号:.*?
如果您的导入语句具有语句的变量(但在Line Break结束),则可以使用以下正则表达式:
<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 ]