2016-12-02 62 views
0

使用下面的代码为例(从docs修改):如何从Java的扫描器中获得匹配的分隔符?

String input = "1 fish 2 fish red sheep blue sheep"; 
Scanner s = new Scanner(input).useDelimiter("\\s*(fish|sheep)\\s*"); 
System.out.println(s.nextInt()); 
System.out.println(s.nextInt()); 
System.out.println(s.next()); 
System.out.println(s.next()); 
s.close(); 

有没有一种方法我可以计算出它是否是sheepfish匹配?

+0

'String.contains( “鱼”)'?或者使用正则表达式Matcher –

+0

我的用例比这个更加复杂,不幸的是:)除了's.next()'根本不返回该标记。 –

回答

0

回答我自己的问题 - 这可以通过不指定分隔符,并使用next(Pattern)替代来实现: - 只有

1 
fish 
2 
fish 
red 
sheep 
blue 
sheep 

编辑 我的做法是错误的:

String input = "1 fish 2 fish red sheep blue sheep"; 
Pattern animal = Pattern.compile("\\s*(fish|sheep)\\s*"); 
Scanner sc = new Scanner(input); 

while (sc.hasNext()) { 
    System.out.println(sc.next()); 
    System.out.println(sc.next(animal)); 
} 

输出因为分隔符是空格(不是我真实情况下的情况)。这是一个更好的办法:

String input = "1.fish.2.fish.red.sheep.blue.sheep"; 
Pattern animal = Pattern.compile("\\.*(fish|sheep)\\.*"); 
Scanner sc = new Scanner(input); 

int endOfLastMatch = 0; 
while (sc.hasNext()) { 
    sc.useDelimiter(animal); 
    String nextMatch = sc.next(); 

    int startOfCurrentMatch = sc.match().start(0); 
    if (endOfLastMatch > 0) { 
     System.out.println(new String(input.getBytes(), endOfLastMatch, startOfCurrentMatch - endOfLastMatch)); 
    } 

    System.out.println(nextMatch); 
    endOfLastMatch = sc.match().end(); 
} 

if (endOfLastMatch < input.length()) { 
    System.out.println(new String(input.getBytes(), endOfLastMatch, input.length() - endOfLastMatch)); 
} 

输出:

1 
.fish. 
2 
.fish. 
red 
.sheep. 
blue 
.sheep 
1

使用该代码,而不是:

String input = "1 fish 2 fish red sheep blue sheep"; 
Pattern pattern = Pattern.compile("\\s*(fish|sheep)\\s*"); 
Matcher matcher = pattern.matcher(input) 

while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

在此代码,matcher.group(1)返回由组1中的正则表达式匹配的值,在这种情况下(fish|sheep)。你可以用括号括起来进行分组。你也可以得到组0,它返回整个比赛。

+0

谢谢你,但我需要分隔符和分割内容 - 我不认为这给了我分裂的内容。我想通过扫描仪中的'next(Pattern)'可以完成。 –

0

也许你正在寻找Scanner.findInLine()方法

String input = "1 fish 2 fish red sheep blue sheep"; 
    Pattern delim = Pattern.compile("\\s*(fish|sheep)\\s*"); 
    Scanner s = new Scanner(input).useDelimiter(delim); 
    while (s.hasNext()) { 
     System.out.println(s.next()); 
     System.out.println(s.findInLine(delim)); 
    } 
    s.close();