【问题标题】:Regular expression for getting specific data获取特定数据的正则表达式
【发布时间】:2012-12-04 10:55:25
【问题描述】:

我有一个可以作为文本框读取的文件,我想只获取之后可用的数据

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);

它工作正常,只获取开始时间和结束时间,但它也显示&lt;?xml 标签。

我该如何解决这个问题?

【问题讨论】:

  • 为正确的工作使用正确的工具。所以这里 XML/HTML 解析器会派上用场,而不是正则表达式。
  • 谢谢。它不是一个 xml 文件,它是一个带有标签的文本文件。我可以在文本框中查看此内容。

标签: java xml regex


【解决方案1】:

我宁愿使用 XML 解析器来阅读这篇文章。正则表达式不适合解析 XML/HTML 等。您会在 SO relating to this 中找到大量参考。

对于 Java,DOM 和 SAX 是可能的,但JDOM 可能是一个更容易的起点。

【讨论】:

  • 谢谢。它不是一个 xml 文件,它是一个带有标签的文本文件。我可以在文本框中查看此内容。
  • 它看起来像一个 XML 文件。为什么不符合?
【解决方案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

【讨论】:

    【解决方案3】:

    它始终是通过解析器解析 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 给 String 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
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      我正在加入以前的答案。但是如果你的文件总是很小,只有几个字符串,你可以使用正则表达式。 在这种情况下,试试这个模式:(\n|\r|.)*end\s*=\s*\"n=(.*)\"(\n|\r|.)*"

      UPD: 第 2 组将完全满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多