Regex 使用正则表达式的不可打印字符匹配

Regex 使用正则表达式的不可打印字符匹配,regex,ant,Regex,Ant,我正在尝试编写一个ant任务,删除与正则表达式匹配的所有行 我现在正在做的是: <replaceregexp byline="true" flags="g"> <regexp pattern="import com.xyz.abc.123.*"/> <substitution expression=""/> <fileset dir="/my/custom/directory"> <include na

我正在尝试编写一个
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问题:当我使用这个regex
import com.xyz*
时,它无法匹配模式,当前的regex是匹配的。
前缀*
是否查找前缀为
前缀的模式


PS:我不想运行另一个任务来删除所有空行,因为这会弄乱格式并删除我想要的空行

您正在使用
\\n
进行换行,而您应该使用
\n
。这与UNIX换行符相匹配。如果您对删除换行符感兴趣,无论是Windows还是UNIX,都可以使用
\r?\n
。确保不要使用标志
byline=“true”
。这将逐行匹配文本,但不包括换行符:

<replaceregexp byline="false" flags="g">
    <regexp pattern="import com\.xyz\.abc\.123\r?\n"/>
如果要将此术语分组,可以使用捕获组或非捕获组:

(prefix)*    -> capturing group
(?:prefix)*  -> non-capturing group
我看到,您使用了
*
。当您停用
署名
时,使用
*
可能会很危险,因为它会匹配任何字符并尽可能多(可能直到文件末尾)。要收集尽可能少的字符,可以在其后面使用问号:
*?

如果您的import语句有一个变量结尾(但在换行符处结束),则可以使用以下正则表达式:

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

谢谢,看完你的答案后,我读了一些基础知识。我不知道点元字符的工作原理,并将其视为文字。我错误地认为点是一个文字,所以我将“*.java”放在文件集include name中,但它起了作用。现在,我替换为查找所有java文件,但这似乎不起作用。
<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 ]