2009-10-10 66 views
0

我想指定一个扫描仪的分隔符,分隔某些模式,但不会从标记中删除该模式。我似乎无法完成这项工作,因为正则表达式所识别的任何东西都会被作为分隔符的一部分被吃掉。有什么建议么?Java扫描程序分隔符的使用

我的具体问题,我有文件看起来像:

text/numbers mix 
numbers 
numbers 
text/numbers mix 
numbers 
numbers 
numbers 
. 
. 

我想从文本/数字混合+行拆分出来,直到下一个文本/数字组合。我有正则表达式来识别它们,但如前所述,使用它作为分隔符可以满足我想要的部分。

编辑:代码追加:

static final String labelRegex="\\s*[^01\\s*]\\w+\\s*"; 
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE); 

是我用来识别文本/数字位模式(我知道我的号码的行包含用空格隔开的所有1/0)。

当我初始化扫描仪:

stateScan = new Scanner(new BufferedReader(new FileReader(source))); 
stateScan.useDelimiter(labelPattern); 

是吃的标签,只是离开行。我目前有一个工作实现,可以从两个来自同一个源的缓冲文件读取器启动两个扫描器,一个由状态分割,另一个由标签分割。我真的很喜欢它只是一个抓住标签+状态。

+1

你可以张贴你已经到目前为止已经试过的代码? – akf 2009-10-10 12:24:47

回答

5

您可以在正则表达式中使用积极的展望。前瞻(和后面)不包括在比赛中,所以他们不会被扫描仪“吃掉”。 此正则表达式可能会做你想要什么:

(?=text/numbers) 

分隔符将是空字符串的子串text/numbers之前。

这里有一个小的演示:

public class Main { 
    public static void main(String[] args) { 
     String text = "text/numbers mix\n"+ 
       "numbers\n"+ 
       "numbers\n"+ 
       "text/numbers mix\n"+ 
       "numbers\n"+ 
       "numbers\n"+ 
       "numbers"; 
     String regex = "(?=text/numbers)"; 
     Scanner scan = new Scanner(text).useDelimiter(regex); 
     while(scan.hasNext()) { 
      System.out.println("------------------------"); 
      System.out.println(">"+scan.next().trim()+"<"); 
     } 
    } 
} 

主要生产:

------------------------ 
>text/numbers mix 
numbers 
numbers< 
------------------------ 
>text/numbers mix 
numbers 
numbers 
numbers< 
+0

辉煌,谢谢。 – Carl 2009-10-10 12:58:42

+0

没问题卡尔。 – 2009-10-10 13:25:59

+0

我最终用了什么:http://stackoverflow.com/questions/1545022/java-scanner-headache – Carl 2009-10-10 16:36:53