这是我的Java 1.5代码(完整示例):
import org.junit.Test;
import static org.junit.Assert.*;
import java.util.Scanner;
import java.util.regex.Pattern;
public class StrangeTest {
@Test
public void testRegExp() {
Pattern re = Pattern.compile("(;|:)[^:;]*");
Scanner scanner = new Scanner(":alpha");
scanner.useDelimiter("");
assertEquals(":alpha", scanner.next(re)); // failure
}
}
这里有什么问题?
答案 0 :(得分:3)
基本上,您的正则表达式匹配任何以:
开头的字符串,即使它只有一个字符::
匹配表达式以及:a
,:al
,...... :alpha
。即使:alpha;beta
也匹配!
如果您在表达式中附加了问号,则表明 non-greedy ,即最短可能的字符串匹配,即:
删除问号以使其贪婪:
Pattern re = Pattern.compile("(;|:).*");
然而,它会匹配:alpha;beta
,所以你需要指出,在分号或冒号后面,你需要任何字符除了分号或冒号:
Pattern re = Pattern.compile("(;|:)[^;:]*");
答案 1 :(得分:1)
我不认为Scanner类的工作方式与您期望的相符......
Scanner scanner = new Scanner(":alpha;beta");
scanner.useDelimiter("(;|:).*?");
System.out.println(scanner.next()); // gives alpha
答案 2 :(得分:0)
您如何证明致电scanner.useDelimiter("");
?如果你把它放在一边,你的匹配工作正常。