【问题标题】:regex or string parsing正则表达式或字符串解析
【发布时间】:2013-02-12 17:16:53
【问题描述】:

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

<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。

【问题讨论】:

  • PACK ??..你想用那个字符串做什么..你的问题不清楚..
  • 应用于您提供的字符串的模式(.*?) 怎么会返回这样的输出?这个真的不清楚。尝试应用SSCCE 概念。
  • 我正在尝试解析该字符串....并获取相应的值,例如 id: 123, Name: xyz , age: 27y。对于所有可用的数据块。
  • 同意您粘贴的代码和示例中有一些可疑之处。但无论如何,没有必要从缓冲区中删除,甚至没有缓冲区。只需创建 regex.matcher(frame) 然后在循环时将 dateElements 收集到 Collection 中。
  • 我也尝试过这样做。它只找到第一个,然后找不到其他的。

标签: java regex


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    <STX>(A*)(.*?)<DATA>(.*?)</DATA>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多