获取两个引号之间的字符串

3
如何获取value=之后两个引号之间的值?
例如:value="hi my name is bob" />
将返回: hi my name is bob
或者value="Ouch! "that hurt" lol..." />
将返回:Ouch! "that hurt" lol...
我知道value=" TEXT_HERE " />总会出现,我想要它里面的字符串。是HTML代码,我已经正确解析了除了这个字段之外的所有数据。
编辑一下,让我澄清一下。我不能使用任何附加工具,因为我正在使用Webdriver来解析页面,获取源代码后,我将HTML放入字符串中,然后尝试从所有数据中解析出"value"标记。 因此,正则表达式代码必须能够浏览各种编码,并获取value字段是什么。我需要每个值字段的数据。

2
你不会试图使用正则表达式来解析HTML吧?(参考链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do) - G_H
如果你要输出到HTML,请使用",但这与Java无关。 - sergtk
如果您正在处理有效的HTML,则value="Ouch! "that hurt" lol..." />应为value="Ouch! "that hurt" lol..." />(内部引号应该被转义)。 - Briguy37
@Briguy37 我认为那不是在“HTML”中转义的方法。 - G_H
我们需要一些关于XML或HTML正则表达式“解析”的“the-pony-comes”标签。 - G_H
Aaaand pst现在是我的新英雄 :) - G_H
6个回答

6
你可以使用 String.indexOf() 来搜索第一个出现的 "。保存第一次出现的索引,使用 String.lastIndexOf() 获取最后一次出现的索引,并调用 String.substring() 来获取你想要的子字符串。

但是 HTML 同样允许属性也用单引号括起来。 - G_H
第二个测试用例未通过(输入无效?)。 - user166390

3

如果您要使用Java解析HTML,我建议您使用像jsoup这样的Java库来简化您的工作。


1

我建议使用 XPath 来完成它所设计的工作。这里有一个例子,应该能帮助你入门:


import java.io.ByteArrayInputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Test {
  public static void main(String[] args) throws Exception {
    String s = ""
      + "<?xml version=\"1.0\"?>"
      + "<root>"
      + "  <a value=\"hello\" />"
      + "  <b value=\'hello\' />"
      + "  <c value=\"hello &quot;bob&quot;\" />"
      + "</root>";
    ByteArrayInputStream bis = new ByteArrayInputStream(s.getBytes());

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document d = builder.parse(bis);
    XPathFactory xpf = XPathFactory.newInstance();
    XPath xpath = xpf.newXPath();
    XPathExpression xpe = xpath.compile("//@value");
    NodeList nl = (NodeList)xpe.evaluate(d, XPathConstants.NODESET);

    for (int i = 0; i < nl.getLength(); i++) {
      System.out.println(nl.item(i).getNodeValue());
    }
  }
}

然后输出为:


hello
hello
hello "bob"

0

这里有一些适用于您的Java代码和正则表达式模式:

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

Pattern pattern = Pattern.compile("[\\d\\w\\s'\"]+\\z");
Matcher matcher = pattern.matcher("value=\"hi my name is bob\"");

while (matcher.find()) {
    System.out.print("found:'"+matcher.group()+"'");
}

打印...

找到:'"我的名字是Bob"'

您需要使用\转义字符串中的引号。


2
他已经准备好了... - G_H

0

你可以使用正则表达式来获取引号之间的值,或者你可以处理包含整个语句/句子/值的字符串。

例如,你可以使用String.replaceAll方法将所有“”(引号)替换为''(空格)。


0

一般来说:

echo 'value="hi my name is bob" />' | perl -nle 'm{value="\s*([^"]*)} and print $1'

@G_H > 这是一个Java问题。但是,当我第一次看到它时,并没有标记为Java。如果是这样的话,那我错过了。 - JRFerguson
它也未通过第二个(无效输入?)测试用例;-) - user166390
当意图使用正则表达式解析HTML时,再多的Perl也无法拯救你。没有什么可以拯救你... - G_H
@pst:哎呀!我错过了那个[没有双关语] :-( - JRFerguson
@G_H:是的,我开始走下这条滑坡了。对于HTML,Perl有HTML解析模块,当然...谢谢你的提醒。 - JRFerguson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接