0

複数のキーワードの前に。が付いている入力ファイルを解析しています+。これ+は、の区切り文字でありsplit、個々のトークンが配列に書き込まれます。結果の配列には、その位置に空白のレコードが含まれます[0]

splitはそれが最初のトークンの前に「何もない」と入力しproject[0]、次にすべて正しいものとして表示される後続のトークンに移動しているのではないかと思います。

Documentaionによると、このメソッドには次のlimitパラメータがあります。

nがゼロの場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができ、末尾の空の文字列は破棄されます。

SOでこの投稿を見つけましたが、提案された解決策では、先頭の区切り文字を編集して(substring(1)一時フィールドを作成するためにを使用しました)、同じ空白のレコードが生成されました。

以下のコードと出力appers。ヒントをいただければ幸いです。

import java.util.regex.*;
import java.io.*;
import java.nio.file.*;
import java.lang.*;
//
public class eadd
{
    public static void main(String args[])
    {
        String projStrTemp = "";
        String projString = "";
        String[] project = new String[10];
        int contextSOF = 0;
        int projStringSOF = 0;
        int projStringEOF = 0;
       //
        String inputLine = "foo foofoo foo foo @bar.com +foofoofoo +foo1 +foo2 +foo3";
        contextSOF = inputLine.indexOf("@");
        int tempCalc = (inputLine.indexOf("+")) ;
        if (tempCalc == -1) {
            proj StrTemp = "+Uncategorized";
        } else {
            projStringSOF = inputLine.indexOf("+",contextSOF);
            projStrTemp = inputLine.trim().substring(projStringSOF).trim();
        }
        project = projStrTemp.split("\\+");
       //
        System.out.println(projStrTemp+"\n"+projString);
        for(int j=0;j<project.length;j++) {
        System.out.println("Project["+j+"] "+project[j]);
        }
    }

CONSOLE OUTPUT: 
+foofoofoo +foo1 +foo2 +foo3

Project[0]
Project[1] foofoofoo
Project[2] foo1
Project[3] foo2
Project[4] foo3
4

3 に答える 3

2

変化する:

projStrTemp = inputLine.trim().substring(projStringSOF).trim();

に:

projStrTemp = inputLine.trim().substring(projStringSOF + 1).trim();

先頭に区切り文字がある場合、配列は空白要素で始まります。split()他のすべての荷物なしで試してみる価値があるかもしれません.

public static void main(String[] args) {
    String s = "an+example";

    String[] items = s.split("\\+");
    for (int i = 0; i < items.length; i++) {
        System.out.println(i + " = " + items[i]);
    }
}

それを使用すると、次のString s = "an+example";ものが生成されます。

0 = an
1 = example

一方String s = "+an+example";、生成します:

0 = 
1 = an
2 = example
于 2012-08-09T12:44:19.403 に答える
1

+簡単な解決策の 1 つは、文字列から 最初のものを削除することです。この方法では、最初のキーワードの前で分割されません:

projStrTemp = inputLine.trim().substring(projStringSOF + 1).trim();

編集:個人的には、正規表現を使用したより堅牢なソリューションを使用したいと思います。で始まるすべてのキーワードが検索され+ます。また、のような単語が一致しない+ように、前にスペースを入れるか、行頭に置く必要があります。3+4

String inputLine = "+foo 3+4 foofoo foo foo @bar.com +foofoofoo +foo1 +foo2 +foo3";
Pattern re = Pattern.compile("(\\s|^)\\+(\\w+)");
Matcher m = re.matcher(inputLine);
while (m.find()) {
    System.out.println(m.group(2));
}
于 2012-08-09T12:50:46.477 に答える
0

+foofoofoo +foo1 +foo2 +foo3

Splits メソッドは、指定された + の一致の前後で文字列を分割するため、配列の最初の要素に空のフィールド (5 つの要素) が含まれます。前のデータを取得したい場合は、最初の + からの部分文字列が含まれている処理された projStrTemp の代わりに inputLine を取得します。

于 2012-08-09T12:55:27.850 に答える