我正在尝试编写一个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:我不想再运行其他任务来删除所有空行,因为这会弄乱格式化并删除我想要的空行。
答案 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 ]