0

だから私はウェブサイトの大きなリストを持っていて、それらをすべて文字列変数に入れたいと思っています。すべてのリンクに個別にアクセスして // をエスケープすることはできないことはわかっていますが、数百を超えるリンクがあります。「ブロックエスケープ」を行う方法はありますか?「ブロック」の間のすべてがエスケープされますか? これは、変数に保存したいものの例です。

String links="http://website http://website http://website http://website http://website http://website"

また、これを行っている間に私が遭遇する可能性のある他の問題を誰かが考えることができますか?

私はそのレベルにいないため、スタックオーバーフローに従って「ハイパーリンク」を投稿することは許可されていないため、httpの代わりにhtpにしました:p

本当にありがとう

編集:電子メールと他のテキストの両方で満たされたWord文書が約50ページあるため、プログラムを作成しています。メールだけを除外したい。これを行うプログラムを作成しましたが、これは非常に簡単で、プログラムが実行される文字列変数にページを格納する必要があるだけではありません。

4

4 に答える 4

2

あなたの質問はよく書かれていません。改善してください。現在の形式では、「あいまいすぎる」として閉じられます。

電子メールまたはWebサイトをフィルタリングしますか?あなたの例はウェブサイトについてです、あなたは電子メールについてテキストを送ります。わからないので、とにかくあなたを助けようと決心したので、両方をやろうと決心しました。

コードは次のとおりです。

private static final Pattern EMAIL_REGEX =
        Pattern.compile("[A-Za-z0-9](:?(:?[_\\.\\-]?[a-zA-Z0-9]+)*)@(:?[A-Za-z0-9]+)(:?(:?[\\.\\-]?[a-zA-Z0-9]+)*)\\.(:?[A-Za-z]{2,})");

private static final Pattern WEBSITE_REGEX =
        Pattern.compile("http(:?s?)://[_#\\.\\-/\\?&=a-zA-Z0-9]*");

public static String readFileAsString(String fileName) throws IOException {
    File f = new File(fileName);
    byte[] b = new byte[(int) f.length()];
    InputStream is = null;
    try {
        is = new FileInputStream(f);
        is.read(b);
        return new String(b, "UTF-8");
    } finally {
        if (is != null) is.close();
    }
}

public static List<String> filterEmails(String everything) {
    List<String> list = new ArrayList<String>(8192);
    Matcher m = EMAIL_REGEX.matcher(everything);
    while (m.find()) {
        list.add(m.group());
    }
    return list;
}

public static List<String> filterWebsites(String everything) {
    List<String> list = new ArrayList<String>(8192);
    Matcher m = WEBSITE_REGEX.matcher(everything);
    while (m.find()) {
        list.add(m.group());
    }
    return list;
}

それが機能することを確認するために、最初にfilterEmailsおよびfilterWebsitesメソッドをテストしてみましょう。

public static void main(String[] args) {
    System.out.println(filterEmails("Orange, pizza whatever else joe@somewhere.com a lot of text here. Blahblah blah with Luke Skywalker (luke@starwars.com) hfkjdsh fhdsjf jdhf Paulo <aaa.aaa@bgf-ret.com.br>"));
    System.out.println(filterWebsites("Orange, pizza whatever else joe@somewhere.com a lot of text here. Blahblah blah with Luke Skywalker (http://luke.starwars.com/force) hfkjdsh fhdsjf jdhf Paulo <https://darth.vader/blackside?sith=true&midclorians> And the http://www.somewhere.com as x."));
}

以下を出力します。

[joe@somewhere.com, luke@starwars.com, aaa.aaa@bgf-ret.com.br]
[http://luke.starwars.com/force, https://darth.vader/blackside?sith=true&midclorians, http://www.somewhere.com]

readFileAsStringメソッドをテストするには:

public static void main(String[] args) {
    System.out.println(readFileAsString("C:\\The_Path_To_Your_File\\SomeFile.txt"));
}

そのファイルが存在する場合、その内容が印刷されます。

アイテムをスペースで割ったもののList<String>代わりに返されるという事実が気に入らない場合は、これを簡単に解決できます。String

public static String collapse(List<String> list) {
    StringBuilder sb = new StringBuilder(50 * list.size());
    for (String s : list) {
        sb.append(" ").append(s);
    }
    sb.delete(0, 1);
    return sb.toString();
}

すべて一緒に固執する:

String fileName = ...;
String webSites = collapse(filterWebsites(readFileAsString(fileName)));
String emails = collapse(filterEmails(readFileAsString(fileName)));
于 2012-12-13T02:46:16.170 に答える
0

Word 文書をプレーン テキストとして保存することをお勧めします。その後、パッケージのクラスを使用できます (テキストの読み取りjava.ioなど)。Scanner

String行を読み取るたびに変数が上書きされる問題を解決するには、配列またはArrayList. Stringいつでも簡単に各アドレスに個別にアクセスできるため、これはすべての Web アドレスを 1 つに保持するよりもはるかに理想的です。

于 2012-12-13T01:16:36.690 に答える
0

最初の問題では、すべてのテキストを単語から取り出し、正規表現を行うものに入れ、正規表現を使用して各行を引用し、各行を+. ここで、最後の行を編集して に変更+;ます。最初の行の上に書き込みString links =ます。この新しいファイルを Java ソースにコピーします。regexrを使用した例を次に示します。

2 番目の質問 (問題を考える) に答えるために、長さが 2^16 を正しく思い出せば、Java 文字列リテラルの上限があります。

ああ、Perl基本的には、この種のことを行うために書かれています(50ページのテキストを取り、URLとメールを分けてください)... 言うまでもありませんgrep.

于 2012-12-13T03:08:16.930 に答える
-1

あなたが言及している「ウェブサイトのリスト」の種類はわかりませんが、たとえば. ファイル全体を読み取り、String split関数を使用して配列を取得したり、 を使用しBufferedReaderてファイルを 1 行ずつ読み取り、ArrayList.

そこから、単に配列をループして aStringに追加できます。または、必要な場合は次のようにします。

「ブロックエスケープ」を実行すると、「ブロック」の間のすべてがエスケープされます

正規表現を使用しStringて、パターンに従ってそれぞれの部分を抽出できます。

String oldString = "<someTag>I only want this part</someTag>";
String regExp = "(?i)(<someTag.*?>)(.+?)(</someTag>)";
String newString = oldString.replaceAll(regExp, "$2");

上記の式は"$2"、式の 2 番目のグループに関心があることを意味するため、xml タグを削除します。ここで、グループは丸括弧で識別されます( )。代わりに使用"$1$3"すると、周囲の xml タグのみが表示されます。

a から特定の「ブロック」を削除するもう 1 つのはるかに簡単な方法Stringは、String replace関数を使用することです。ブロックを削除するには、新しい値として空の文字列を渡すだけです。

これが役に立てば幸いです。それ以外の場合は、「Web サイトのリスト」と必要な出力を入力して完全な例を提供してみてください。

于 2012-12-13T01:11:30.430 に答える