我有一个可以作为文本框阅读的文件,我想只获得
之后可用的数据start =“n = and 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
标记。
我该如何解决这个问题?
答案 0 :(得分:3)
我宁愿使用XML解析器来阅读它。 Regex不适合解析XML / HTML等。您可以在SO relating to this中找到大量参考文献。
对于Java,DOM和SAX是可能的,但JDOM可能是一个更容易的起点。
答案 1 :(得分: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
答案 2 :(得分:1)
我加入了以前的答案。但是如果你的文件总是很小,只有几个字符串,你可以使用Regexp。
在这种情况下,请尝试以下模式:(\n|\r|.)*end\s*=\s*\"n=(.*)\"(\n|\r|.)*"
UPD:第2组将为您提供您想要的。
答案 3 :(得分: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");
上面的示例将 10.815s 提供给字符串startTime
。如果要获取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
希望有所帮助