使用正则表达式

时间:2017-02-16 01:44:27

标签: regex ant

我正在尝试编写一个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找不到前缀为package acourtney; import java.util.Scanner; public class Hmwk03 { public static void main(String[] args) { int number1 = (int)(Math.random() * 10); int number2 = (int)(Math.random() * 10); int counter = 0; Scanner input =new Scanner(System.in); System.out.print ("What is " + number1 + " + " + number2 + " ? " + "(You have three chances) "); int answer = input.nextInt(); if (number1 + number2 == answer) System.out.println("Answer is correct"); else System.out.println("Your answer is incorrect. You have two chances left "); counter = 2; System.out.print("What is " + number1 + " + " + number2 + " ? "); answer = input.nextInt(); if (number1 + number2 == answer) System.out.println("Answer is correct"); else System.out.println("Your answer is incorrect. You have one chance left"); counter = 3; System.out.print("What is " + number1 + " + " + number2 + " ? "); answer = input.nextInt(); if (number1 + number2 == answer) System.out.println("Answer is correct"); else System.out.println("Your answer is incorrect, You have failed"); } } 的模式?

PS:我不想再运行其他任务来删除所有空行,因为这会弄乱格式化并删除我想要的空行。

1 个答案:

答案 0 :(得分:1)

您正在使用\\n换行,而您应该使用\n。这与UNIX换行符匹配。如果您有兴趣删除换行符,无论是Windows还是UNIX,您还可以使用\r?\n。请务必不要使用标记byline="true"。这将逐行匹配您的文本,但不包括换行符:

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

你可能已经看到,点字符.在这里被转义。点字符表示&#34;每个字符&#34;在正则表达式。因为你真的想在这里匹配一个点,你需要逃避它。

*字符表示前面的标记(通常是一个字母)可以匹配0或大于0次(但是贪婪)。在您的情况prefix*中,以下示例将匹配:

prefi
prefix
prefixxxxx
prefixxxxxxxxx

如果要将此术语组合在一起,可以使用捕获或非捕获组:

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

我看到你使用了.*。当您停用byline时,使用.*会很危险,因为它匹配任何字符且尽可能多(可能直到文件末尾)。要收集尽可能少的字符,您可以在其后面使用问号:.*?

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

<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 ]