Java 拆分没有空格的字符串

Java 拆分没有空格的字符串,java,regex,string,netbeans,openvas,Java,Regex,String,Netbeans,Openvas,我有以下字符串,它由外部程序(OpenVAS)生成,并作为字符串成功返回到我的程序 <create_target_response id="b4c8de55-94d8-4e08-b20e-955f97a714f1" status_text="OK, resource created" status="201"></create_target_response> 似乎我只需要避开“而不是=”(如果我这样做,Java就会抛出一个错误) 提前谢谢 编辑:现在使用jSoup l

我有以下字符串,它由外部程序(OpenVAS)生成,并作为字符串成功返回到我的程序

<create_target_response id="b4c8de55-94d8-4e08-b20e-955f97a714f1" status_text="OK, resource created" status="201"></create_target_response>
似乎我只需要避开“而不是=”(如果我这样做,Java就会抛出一个错误)

提前谢谢

编辑:现在使用jSoup lib编写代码-不会显示“id”字符串。有什么想法吗? 谢谢

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
//TODO在此处添加您的处理代码:
字符串targetip=jTextField1.getText();//获取IP地址
字符串targetname=jTextField5.getText();//获取目标名称
字符串Vag=“8d32ad99-ac84-4fdc-b196-2b379f861def”;
字符串Lob=“”;
最后一个字符串dosCommand=“cmd/c omp-u admin-w admin--xml=\”“+TargName+”“+TargIP+”“\”;
3\"";
最终字符串位置=“C:\\”;
试一试{
最终进程=Runtime.getRuntime().exec(
dosCommand+“”+位置);
final InputStream in=process.getInputStream();
int-ch;
而((ch=in.read())!=-1){
系统输出打印((字符)ch);
Lob=String.valueOf((char)ch);
jTextArea2.追加(Lob);
}
}捕获(IOE异常){
e、 printStackTrace();
}
String id=Jsoup.parse(Lob.getAllegements().attr(“id”);
System.out.println(id);//这不输出吗?
}

在我看来,这比你做的要简单得多。首先,在
空格上拆分,然后检查
=
是否存在。如果存在,则在
=
上拆分
,最后从第二个令牌中删除

棘手的是
中的空格。这需要一些正则表达式,您可以从中计算出来

范例

我的方法的优势

如果输入遵循
key=“value”key=“value”
的格式,则您可以解析通过的任何内容,而不是硬编码属性的名称

如果这是XML..


然后使用XML解析器。有一个很好(很棒)的答案可以解释为什么不应该使用
String
操作来解析XML/HTML。是答案。

您可以使用正则表达式提取所需内容;更重要的是,
id
的值似乎是一个UUID。因此:

private static final Pattern PATTERN
    = Pattern.compile("\\bid=\"([^\"]+)\"");

// In code...
public String getId(final String input)
{
    final Matcher m = PATTERN.matcher(input);
    if (!m.find())
        throw new IllegalArgumentException("String does not contain a Target ID");
    final String uuid = m.group(1);
    try {
        UUID.fromString(uuid);

    } catch (IllegalArgumentException ignored) {
        throw new IllegalArgumentException("String does not contain a Target ID");
    }

    return uuid;
}

这将使您更容易获得工作id:

int idStart = Lob.indexOf("id=")+("id=\"").length();
System.out.println(Lob.substring(idStart,Lob.indexOf("\"",idStart)));
根据“.”进行拆分,可以得到所有键值

String str = "<create_target_response id=\"b4c8de55-94d8-4e08-b20e-955f97a714f1\" status_text=\"OK, resource created\" status=\"201\"></create_target_response>";
String[] tokens = str.split("\\\"");
System.out.println(tokens[1]);
System.out.println(tokens[5]);

每个人都告诉您使用XML解析器(他们是对的),但没有人告诉您如何使用

下面是:

String lob = ...
使用Jsoup from,实际上是一个HTML解析器,但也可以灵活地处理XML:

String id = Jsoup.parse(lob).getAllElements().attr("id");
// b4c8de55-94d8-4e08-b20e-955f97a714f1
内置Java XML API,不太简洁,但没有附加库:

Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder()
    .parse(new InputSource(new StringReader(lob)));
String id = dom.getDocumentElement().getAttribute("id");
// b4c8de55-94d8-4e08-b20e-955f97a714f1

您应该尝试使用xml解析器。这对您来说会更容易、更好。您可能想提及4恰好是
id=“
”的长度(或者更好的做法是,将该字符串设为变量,并使用它的
.length()
)——一周后返回代码时需要记住的神奇数字更少。@PhilippReichart更新了我的答案。谢谢你的建议。嗨-谢谢你在这方面的帮助。我使用了上面描述的jSoup方法,但似乎无法获得要输出的id字符串。我将尝试按原样添加代码。可能在顶部,我不明白你为什么要更改“str”字符串。OpenVAS在将XML发送到我的程序时不包含这些退格?Java中使用双引号
表示字符串值的开始和结束。如果您希望字符串中包含文本
,则必须将其转义为
\”
,有关详细信息,请参阅上一节。
b4c8de55-94d8-4e08-b20e-955f97a714f1
201
String lob = ...
String id = Jsoup.parse(lob).getAllElements().attr("id");
// b4c8de55-94d8-4e08-b20e-955f97a714f1
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder()
    .parse(new InputSource(new StringReader(lob)));
String id = dom.getDocumentElement().getAttribute("id");
// b4c8de55-94d8-4e08-b20e-955f97a714f1