0

我正在尝试解析具有特定模式的字符串。一个有效的字符串示例如下:

<STX><DATA><ETX>
<STX>A?123<ETX>
<STX><DATA><ETX>
<STX>name!xyz<ETX>
<STX>age!27y<ETX>
<STX></DATA><ETX>
<STX>A?234<ETX>
<STX><DATA><ETX>
<STX>name!abc<ETX>
<STX>age!24y<ETX>
<STX></DATA><ETX>
<STX>A?345<ETX>
<STX><DATA><ETX>
<STX>name!bac<ETX>
<STX>age!22y<ETX>
<STX></DATA><ETX>
<STX>OK<ETX>
<STX></DATA><ETX>

此数据由设备发送。我只需要用 id:123 name:xyz, age 27y 解析这个字符串。

我正在尝试使用这个正则表达式:

最终模式正则表达式 = Pattern.compile("(.*?)", Pattern.DOTALL);

这确实输出了所需的数据:

<ETX>
<STX>A?123<ETX>
<STX><DATA><ETX>
<STX>name!xyz<ETX>
<STX>age!27y<ETX>
<STX>

如何递归循环字符串以将所有内容复制到字符串列表中。我正在尝试循环并删除提取的模式,但它不会删除。

    final Pattern regex = Pattern.compile("<DATA>(.*?)</DATA>", Pattern.DOTALL);// Q?(.*?)
    final StringBuffer buff = new StringBuffer(frame);
    final Matcher matcher = regex.matcher(buff);
    while (matcher.find())
        {
            final String dataElements = matcher.group();
            System.out.println("Data:" + dataElements);
        }
    }

有没有更好的方法来做到这一点。

这是我目前得到的输出:

Data:<DATA><ETX><STX>A?123<ETX><STX><DATA><ETX><STX>name!xyz<ETX><STX>age!27y<ETX><STX>   </DATA>
Data:<DATA><ETX><STX>name!abc<ETX><STX>age!24y<ETX><STX></DATA>
Data:<DATA><ETX><STX>name!bac<ETX><STX>age!22y<ETX><STX></DATA>

在接下来的两场比赛中,我错过了 A?234 和 A?345。

4

2 回答 2

0

我真的不知道你到底想通过这个实现什么,但如果你想删除该模式的出现,这一行:

buff.toString().replace(dataElements, "")

看起来不太好。您只是在编辑该 buff 的字符串表示形式。您必须再次将编辑后的版本替换回 buff(施法后)。

于 2013-02-12T17:29:28.140 回答
0

使用这个正则表达式解决了我的问题:

<STX>(A*)(.*?)<DATA>(.*?)</DATA>
于 2013-02-12T18:05:55.663 回答