3

テキストボックスとして読み取ることができるファイルがあります。その後に使用可能なデータのみを取得したいのですが。

start="n=およびend="n =

 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE smil PUBLIC "-//W3C//DTD SMIL 1.0//EN" "SMIL10.dtd">
 <head>
 </head>
     <body>
            <audio start="n=10.815s" end="n=19.914s"/>
 </body>
</xml>

私は次のことをやってみました:

   String startTime = readString.replaceAll(".*start=\"n=|\\s.*", "").trim();
   String endTime = readString.replaceAll(".*end=\"n=|\\s.*", "").trim();
   Log.e("Start Time is :" , startTime);
   Log.e("endTime Time is :" , endTime);

開始時刻と終了時刻を取得するだけで正常に動作しますが、<?xmlタグも表示されます。

これを修正するにはどうすればよいですか?

4

4 に答える 4

3

これを読むには、むしろXMLパーサーを使用したいと思います。正規表現は、XML / HTMLなどの解析には適していません。これに関連するSOには、多数の参照があります。

Javaの場合、DOMとSAXが可能ですが、JDOMの方が簡単な出発点になる可能性があります。

于 2012-12-17T10:45:39.470 に答える
2

以下のJavaで解決策を見つけてください。これは、文字列を含むすべてのデータで機能します。

<audio start="n=........" end="n=......." />

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

public class Test {
public static void main(String[] args) 
{
String inputData1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
                        "<!DOCTYPE smil PUBLIC \"-//W3C//DTD SMIL 1.0//EN\" \"SMIL10.dtd\">"
                        + "<head>" 
                        + "</head>" 
                        + "<body>"
                        + "<audio start=\"n=10.815s\" end=\"n=19.914s\"/>"
                        + "<sometag> <audio start=\"n=10.815s\" end=\"n=20.914s\"/> </sometag>"
                        + "</body>"
                        + "</xml>";

    String inputData2 = "some data goes here with or without tags; <audio start=\"n=10.815s\" end=\"n=20.914s\"/>; askjdhfla ";

    Pattern pattern = Pattern.compile("<audio[^>]*start\\s*=\\s*\"n\\s*=\\s*([^\"]*)\"[^>]*end=\"n\\s*=\\s*([^\"]*)\"[^>]*>");
    Matcher matcher = pattern.matcher(inputData1);

    while(matcher.find()){
        System.out.println("start=\"n="+matcher.group(1)+", & end=\"n="+matcher.group(2)+"");
    }

}
}

Output For InputData1:
start="n=10.815s, & end="n=19.914s
start="n=10.815s, & end="n=20.914s


Output For InputData2:
start="n=10.815s, & end="n=20.914s
于 2012-12-17T14:32:51.723 に答える
1

私は前の答えに参加しています。ただし、ファイルが常に小さく、文字列が数個しかない場合は、正規表現を使用できます。この場合、次のパターンを試してください。(\n|\r|.)*end\s*=\s*\"n=(.*)\"(\n|\r|.)*"

UPD:グループ#2はあなたが望むものを正確に提供します。

于 2012-12-17T10:51:31.203 に答える
1

これは、正規表現ではなく、パーサーによってxml/htmlを解析するための最良の方法です。しかしあなたの問題に関して。次のことを試すことができます:

String s = "foo\n <audio start=\"n=10.815s\" end=\"n=19.914s\"/>bar\n";
String re = "(?s).*?(?<=start=\"n=)([^\"]*).*";
String startTime=s.replaceAll(re, "$1");

上記の例では、Stringに10.815startTimeが与えられます。endTimeを取得する場合は、re(start)を(end)に置き換えます

正規表現についての簡単な説明:

(?s) is flag dotall, which means, the regex will match new lines as well
(?<=start=\"n=)([^\"]*) this is look behind. 
                        search for text following start="n=
                        and not "(double quote) in this case is 10.815s

それが役に立てば幸い

于 2012-12-17T11:09:41.547 に答える