Java 读取部分字符串
Java read part of string
我有这段文字:
<message id="dsds" to="test@test.com" type="video" from="test@test"><body>TESTTESTTEST</body><active xmlns="http://jabber.org"/></message>
我想得到这个字符串中 <body></body>
的部分。
在java中,我搜索并找到了split,但它不能解决我的问题。如何在 java 中获取 <body></body>
之间的文本?
使用regx包:
String htmlString = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";
String bodyText="";
Pattern p = Pattern.compile("<body.*>(.*?)</body.*>");
Matcher m = p.matcher(htmlString);
if (m.find()) {
bodyText = m.group(1);
}
System.out.println(bodyText);
输出: TESTTESTTEST
在那种特定情况下,我建议您使用 Matcher
的正则表达式
可能的解决方案:
Java regex to extract text between tags
像这样使用正则表达式:(适用于 <body>asas asasa </body>
以及 <body> </body>
public static void main(String[] args) {
String s = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";
Pattern p = Pattern.compile("<body.*>(.*?)</body>");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group(1));
}
}
O/P :
TESTTESTTEST
你可以这样写代码-
String s = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";//Use '/' character as escape for "
int firstIndex = s.indexOf("<body>");
int lastIndex = s.indexOf("</body>");
System.out.println(s.substring(firstIndex+6, lastIndex));
它会打印出预期的结果。
使用 SAXParser 或 DocumentBuilder 之类的解析器是首选。您可以准确地获取标签并处理数据。当您有很多标签要处理时,它们会特别方便。
下面是一个使用解析器读取正文标签的例子:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler(){
String body = "";
boolean isBody = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("body")) {
isBody = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (isBody) {
body = new String(ch, start, length);
System.out.println("body : " + body);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("body")) {
isBody = false;
}
}
};
saxParser.parse(new InputSource(new StringReader("<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body id=\"dd\">TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>")), handler);
已经给出了通过正则表达式解决它的答案(尽管 XML 解析器可能是更好的选择)。
给出修改上述解决方案中提出的正则表达式的简单建议:
Regex proposed: (<body.*>(.*?)</body.*>) => This regex is greedy.
Non greed regex: <body[^>]*>(.*?)</body[^>]*>
您可以使其非贪婪,这将导致 运行 时间的改进。原始正则表达式的问题是 .* 将继续匹配直到字符串结尾,然后它会回溯。 “[^>]”一看到右尖括号就会停止。我 运行 一个比较正则表达式的简单测试。贪心的时间是非贪心时间的 3 倍。
我有这段文字:
<message id="dsds" to="test@test.com" type="video" from="test@test"><body>TESTTESTTEST</body><active xmlns="http://jabber.org"/></message>
我想得到这个字符串中 <body></body>
的部分。
在java中,我搜索并找到了split,但它不能解决我的问题。如何在 java 中获取 <body></body>
之间的文本?
使用regx包:
String htmlString = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";
String bodyText="";
Pattern p = Pattern.compile("<body.*>(.*?)</body.*>");
Matcher m = p.matcher(htmlString);
if (m.find()) {
bodyText = m.group(1);
}
System.out.println(bodyText);
输出: TESTTESTTEST
在那种特定情况下,我建议您使用 Matcher
的正则表达式可能的解决方案: Java regex to extract text between tags
像这样使用正则表达式:(适用于 <body>asas asasa </body>
以及 <body> </body>
public static void main(String[] args) {
String s = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";
Pattern p = Pattern.compile("<body.*>(.*?)</body>");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group(1));
}
}
O/P :
TESTTESTTEST
你可以这样写代码-
String s = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";//Use '/' character as escape for "
int firstIndex = s.indexOf("<body>");
int lastIndex = s.indexOf("</body>");
System.out.println(s.substring(firstIndex+6, lastIndex));
它会打印出预期的结果。
使用 SAXParser 或 DocumentBuilder 之类的解析器是首选。您可以准确地获取标签并处理数据。当您有很多标签要处理时,它们会特别方便。
下面是一个使用解析器读取正文标签的例子:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler(){
String body = "";
boolean isBody = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("body")) {
isBody = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (isBody) {
body = new String(ch, start, length);
System.out.println("body : " + body);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("body")) {
isBody = false;
}
}
};
saxParser.parse(new InputSource(new StringReader("<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><body id=\"dd\">TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>")), handler);
已经给出了通过正则表达式解决它的答案(尽管 XML 解析器可能是更好的选择)。
给出修改上述解决方案中提出的正则表达式的简单建议:
Regex proposed: (<body.*>(.*?)</body.*>) => This regex is greedy.
Non greed regex: <body[^>]*>(.*?)</body[^>]*>
您可以使其非贪婪,这将导致 运行 时间的改进。原始正则表达式的问题是 .* 将继续匹配直到字符串结尾,然后它会回溯。 “[^>]”一看到右尖括号就会停止。我 运行 一个比较正则表达式的简单测试。贪心的时间是非贪心时间的 3 倍。