-1

次の形式の入力文字列があり"[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]"、トークン"Animal rights" , "Anthropocentrism"などを抽出する必要があります。

String ライブラリの split メソッドを使用してみましたが、トークンを取得するための適切な正規表現が見つかりません。誰か助けていただければ幸いです。

私は基本的にウィキペディア XML ファイルの内部リンクを解析しようとしています。形式はこちらで確認できます。

4

4 に答える 4

7

おそらくここで使用するべきではありませんがsplit()、代わりにMatcher:

String input = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
Matcher m = Pattern.compile("\\[\\[(.*?)\\]\\]").matcher(input);

while (m.find()) {
    System.out.println(m.group(1));
}
動物の権利
人間中心主義
人類学
于 2013-09-12T19:35:00.633 に答える
2

次のようなパターンが機能するはずです。

\[\[(.*?)\]\]

[[これは、リテラルの後に任意の文字が 0 個以上続き、欲張らずにグループ 1 でキャプチャされ、その後にリテラルが続くものと一致し]]ます。

\Java 文字列リテラルのをエスケープすることを忘れないでください。

Pattern.compile("\\[\\[(.*)?\\]\\]");
于 2013-09-12T19:34:52.847 に答える
1

正規表現を使用すると非常に簡単です。

\[\[(.+?)\]\]

正規表現の視覚化

Debuggex でライブ編集

.+括弧内に実際に何かがあることを確認するためにa を実行することをお勧めします。配列に入れようとしているときに何かが存在しない場合は 、 a は取得されません。null

string output = new string [10]; 
string pattern =  "\[\[(.+?)\]\]";
string input = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
Matcher m = Pattern.compile(pattern).matcher(input);

int increment= 0;
while (m.find()) {
    output[increment] = m.group(1);
    increment++;
}

あなたが正規表現を学びたいと言ったので、私はそれを分解します。

  • \[ 2xは、正規表現の特殊文字であるため、[必要な括弧を見つけています\
  • .改行を除くすべての文字を表すことができます
  • +その文字の 1 つ以上を意味します
  • ?前の項目を 1 回以上繰り返します。怠惰なため、エンジンは最初に前のアイテムを 1 回だけ照合してから、前のアイテムの一致を増やしながら順列を試行します。
  • \]をキャプチャしています]
于 2013-09-12T19:35:45.523 に答える
0

次を試してください。

String str = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
str = str.replaceAll("(^\\[\\[|\\]\\]$)", "");
String[] array = str.split("\\]\\] \\[\\[");

System.out.println(Arrays.toString(array));
// prints "[Animal rights, Anthropocentrism, Anthropology]"
于 2013-09-12T19:56:40.060 に答える