web-dev-qa-db-ja.com

Javaの正規表現:改行の扱い方

私は現在、正規表現の使用方法を学ぼうとしているので、簡単な質問に耐えてください。たとえば、改行で区切られた多数のリンクを含む入力ファイルがあるとします。

www.foo.com/Archives/monkeys.htm
MonkeyのWebサイトの説明。

www.foo.com/Archives/pigs.txt
PigのWebサイトの説明。

www.foo.com/Archives/kitty.txt
キティのウェブサイトの説明。

www.foo.com/Archives/Apple.htm
AppleのWebサイトの説明。

説明とともに1つのWebサイトを取得したい場合、この正規表現はテストツールで動作するようです:.*www.*\\s.*Pig.*

ただし、コード内で実行しようとすると、動作しないようです。この表現は正しいですか? 「\ s」を「\ n」に置き換えようとしましたが、まだ機能していないようです。

26
user415663

将来の参照のために、「。」にPattern.DOTALLフラグを使用することもできます。\rまたは\ nにも一致します。

例:

このようなhttpヘッダー行の単一の文字列を解析しているとします(各行は\ r\nで終わります)

HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: SAMEORIGIN
Location: http://localhost:8080/blah.htm
Content-Length: 0

このパターン:

final static Pattern PATTERN_LOCATION = Pattern.compile(".*?Location\\: (.*?)\\r.*?", Pattern.DOTALL);

「matcher.group(1)」を使用してロケーション値を解析できます。

「。」上記のパターンでは\ rと\ nが一致するため、上記のパターンは実際にhttpヘッダー行の「Location」を解析できます。ターゲット行の前後に他のヘッダーがある場合があります(これが推奨される方法ではありませんhttpヘッダーの解析)。

また、パターン内で「?s」を使用して同じ効果を得ることができます。

これを行う場合は、Matcher.find()を使用することをお勧めします。

12
javaPhobic

これを試して

([^\r]+\r[^\r])+
1
user414661

私のために働く:

import Java.util.regex.Pattern;
import Java.util.regex.Matcher;
public class Foo {
  public static void main(String args[]) {
    Pattern p = Pattern.compile(".*www.*\\s.*Pig.*");
    String s = "www.foo.com/Archives/monkeys.htm\n"
             + "Description of Monkey's website.\n"
             + "\n"
             + "www.foo.com/Archives/pigs.txt\n"
             + "Description of Pig's website.\n"
             + "\n"
             + "www.foo.com/Archives/kitty.txt\n"
             + "Description of Kitty's website.\n"
             + "\n"
             + "www.foo.com/Archives/Apple.htm\n"
             + "Description of Apple's website.\n";
    Matcher m = p.matcher(s);
    if (m.find()) {
      System.out.println(m.group());
    } else {
      System.out.println("ERR: no match");
    }
  }
}

おそらく問題は、PatternおよびMatcherオブジェクトの使用方法にありましたか?

1
maerics

このバージョンは、Windows(\ r\n)またはUnix(\ n)のいずれかの改行に一致します

Pattern p = Pattern.compile("(www.*)((\r\n)|(\n))(.*Pig.*)");
String s = "www.foo.com/Archives/monkeys.htm\n"
           + "Description of Monkey's website.\n"
           + "\r\n"
           + "www.foo.com/Archives/pigs.txt\r\n"
           + "Description of Pig's website.\n"
           + "\n"
           + "www.foo.com/Archives/kitty.txt\n"
           + "Description of Kitty's website.\n"
           + "\n"
           + "www.foo.com/Archives/Apple.htm\n"
           + "Description of Apple's website.\n";
Matcher m = p.matcher(s);
if (m.find()) {
  System.out.println("found: "+m.group());
  System.out.println("website: "+m.group(1));
  System.out.println("description: "+m.group(5));
}
System.out.println("done");
0
Gary