2009-10-10 46 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