无法使用模式匹配器获得正确的输出

时间:2013-05-20 11:38:33

标签: java matcher

我想在下面的字符串中获取id字段的值,其中inuse字段的值为1。

          "version": "IPv6",
              "primarywins": null,
              "id": 3,
              "updated": 1368803376681,
              "description": null,
              "inuse": 0,
              "alias": "Shared MGMT"
           },
           {
              "computernameprefix": null,
              "protocol": "static",
              "version": "IPv4",
              "primarywins": null,
              "id": 5,
              "updated": 1368912314856,
              "description": null,
              "inuse": 1

我正在尝试下面的java代码

String regex = "\"id\": ([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9][0-9][0-9]),\n.*,\n.*,\n.*\"inuse\": 1";
Pattern index_pattern2 = Pattern.compile(regex,Pattern.DOTALL);
Matcher cMatcher2 = index_pattern2.matcher(The string mentioned above);
     if(cMatcher2 != null && cMatcher2.find()
      {
        ipGrp = cMatcher2.group(1);
      }

上面代码中ipGrp的值总是3,而我想得到5的值 当使用的值是1

时,如何获得正确的id字段的值的任何建议

2 个答案:

答案 0 :(得分:0)

请改用此正则表达式:

"id": ([0-9]{1,4})[^}]*"inuse": 1

转义:

"\"id\": ([0-9]{1,4})[^}]*\"inuse\": 1"

我在这做什么?

  1. [0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9][0-9][0-9]更改为[0-9]{1,4},这意味着[0-9]必须介于1到4之间。
  2. ,\n.*,\n.*,\n.*更改为[^}]*,即}以外的任何字符。

答案 1 :(得分:0)

试试这个。

(?s)"id":\s?(\d+),+.*?(?:"inuse":\s)(\d)

它捕获非活动和活动,但您可以过滤结果。 (?s)导致“。”捕获换行符。第一个捕获组捕获id。 (?:导致第二组不捕获。第二个捕获组捕获活动标记。祝你好运。