2009-10-10 2 views
0

Я хотел бы указать разделитель для сканера, который разбивается на какой-либо шаблон, но не удаляет этот шаблон из токенов. Я не могу сделать эту работу, поскольку все, что идентифицируется регулярным выражением, также съедается как часть разделителя. Какие-либо предложения?Использование разделителя Java-сканера

Моя конкретная проблема, у меня есть файл, который выглядит следующим образом:

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

Я хотел бы, чтобы расколоть из текста/чисел смеси + строк до следующего текста/смеси чисел. У меня есть регулярное выражение, чтобы идентифицировать их, но, как указано, используя это, поскольку разделитель ест часть того, что я хочу.

EDIT: код добавления:

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

это образец, который я использовал, чтобы определить бит текста/номера (я знаю, что мои номера строк содержат все 1/0s, разделенных пробелами).

Когда я инициализация сканера:

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

, который ест этикетки, и просто оставляет строку. В настоящее время у меня есть рабочая реализация, которая запускает два сканера на двух буферизованных считывателях файлов из одного источника, одно разделение по состояниям, а другое - на метки. Мне бы очень хотелось, чтобы это было просто одно захватывающее ярлык + состояние.

+1

Вы можете разместить код, который вы пробовали до сих пор? – akf

ответ

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

+0

Без проблем Карл. –

+0

В чем я в конечном итоге пошел: http://stackoverflow.com/questions/1545022/java-scanner-headache – Carl

Смежные вопросы