1

あるパターンで分割するスキャナーの区切り文字を指定したいのですが、トークンからそのパターンを削除しません。正規表現によって識別されるものも区切り文字の一部として食べられるため、この作業を行うことができないようです。助言がありますか?

私の特定の問題、次のようなファイルがあります。

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);

ラベルを食べて、行を残すだけです。私は現在、同じソースから2つのバッファリングされたファイルリーダーで2つのスキャナーを開始する実装を実装しています.1つは状態によって分割され、もう1つはラベルによって分割されます。ラベルと状態を1つだけ取得したいのです。

4

1 に答える 1

6

正規表現で前向き先読みを使用できます。ルック アヘッド (およびビハインド) は一致に含まれないため、スキャナーによって「食べられる」ことはありません。この正規表現はおそらくあなたが望むことをします:

(?=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<
于 2009-10-10T12:33:12.157 に答える