3

私はひもを持っています、

    string1 = "Sri Lanka National Chess Championship this year and represented Sri Lanka at represented Sri Lanka Universities at the World University Chess Championships."

また、「string2」という名前の別の文字列があります。これ<NOUN> and </NOUN>は、スペースで区切られた「 」タグで囲まれた文字列のみです。

string2 = "<NOUN>Sri Lanka National Chess Championship</NOUN> <NOUN>Sri Lanka</NOUN> <NOUN>Sri Lanka</NOUN> <NOUN>World University Chess</NOUN>"

2番目の文字列には、任意の名詞タグ付き単語を含めることができることに注意してください(「string1」に基づいて、たとえば、string1に3つの名詞がある場合、string2には同じ3つの名詞が名詞タグで囲まれます)
「string1」にタグを追加し、次のようにstring1を作成し、

string1 = "<NOUN>Sri Lanka National Chess Championship</NOUN> this year and represented <NOUN>Sri Lanka</NOUN> at represented <NOUN>Sri Lanka</NOUN> Universities at the <NOUN>World University Chess</NOUN> Championships."

これを行うには、次のコードを使用しました。

Pattern p = Pattern.compile("<NOUN>(.*?)</NOUN>");
    Matcher m = p.matcher(string2);
    while(m.find()) {
        string1= string1.replaceAll(m.group(1),m.group(0));
    } 

しかし、それは私に次の出力を与えます、

<NOUN><NOUN><NOUN>Sri Lanka</NOUN></NOUN> National Chess Championship</NOUN> this year and represented <NOUN><NOUN>Sri Lanka</NOUN></NOUN> at represented <NOUN><NOUN>Sri Lanka</NOUN></NOUN> Universities at the <NOUN>World University Chess</NOUN> Championships.

誰でもこれを正しく行う方法を教えてもらえますか?
または、指定された出力から目的の出力を取得する方法を教えてください。

4

2 に答える 2

2

それ以外の :

string1= string1.replaceAll(m.group(1),m.group(0));

使用する :

string1= string1.replaceAll("(?<!<NOUN>)("+m.group(1)+")(?!</NOUN>)",m.group(0));

「Look Ahead および Look Behind Constructs」の詳細については、こちらを参照してください

于 2012-08-18T08:57:06.970 に答える
0

あなたの例の問題は、それSri Lanka National Chess Championshipが名詞でありSri Lanka、この文字列の一部も名詞であることです。したがって、マッチャーは文字列を複数回置き換えています。

この問題は、既に置換されている文字列フラグメントを置換しないことで解決できます。一致ごとに文字列を 3 つの部分に分割しました: before、match-str、after。壊れた文字列の順序を維持します。Vector は、このための非常に便利なデータ構造です。

import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Check {

static String print(Vector<String> parts) {
    String str = parts.elementAt(0);

    for(int i=1; i<parts.size(); i++) {
        str += parts.elementAt(i); 
        //System.out.print(i + " : " + parts.elementAt(i) + "\n");
    }

    return str;
}

public static void main(String args[]) {
    String string1;
    String string2;
    String expected;

    string1 = "Sri Lanka National Chess Championship this year and represented Sri Lanka at represented Sri Lanka Universities at the World University Chess Championships.";
    string2 = "<NOUN>Sri Lanka National Chess Championship</NOUN> <NOUN>Sri Lanka</NOUN> <NOUN>Sri Lanka</NOUN> <NOUN>World University Chess</NOUN>";
    expected = "<NOUN>Sri Lanka National Chess Championship</NOUN> this year and represented <NOUN>Sri Lanka</NOUN> at represented <NOUN>Sri Lanka</NOUN> Universities at the <NOUN>World University Chess</NOUN> Championships.";


    Pattern p = Pattern.compile("<NOUN>(.*?)</NOUN>");
    Matcher m = p.matcher(string2);
    Vector<String> parts = new Vector<String>();
    parts.add(string1);

    while(m.find()) {
        for(int i=0; i<parts.size(); i++) {

            //search for used part
            if(parts.elementAt(i).indexOf("<NOUN>")!=-1) {
                continue;
            }

            // search for pattern
            String cur = parts.elementAt(i);
            int disp = cur.indexOf(m.group(1));
            if(disp==-1) {
                continue;
            } else {
                parts.remove(i);
                Vector<String> newParts = new Vector<String>();

                if(disp!=0) {
                    newParts.add(cur.substring(0, disp));
                }

                newParts.add(m.group(0));

                if((disp+m.group(1).length())!=cur.length()) {
                    newParts.add(cur.substring(disp+m.group(1).length()));
                }

                if(i!=0) {
                    parts.addAll(i, newParts);
                } else {
                    parts.addAll(newParts);
                }

                //System.out.print(print(parts) + "\n");
            }           
        }
    }

    string1 = print(parts);
    if(!string1.equals(expected)) {
        System.out.println("Unexpected output !!");
    } else {
        System.out.println("Correct !!");
    }
}

};

便宜上、print メソッドの名前を stringify に変更できます。

于 2012-08-18T07:04:49.507 に答える