3

我有一个这样的信息动态输入示例:

Xbox 360(黑色)精英控制台 120GB(伊利诺伊州梅森市)200 美元

200 美元 2013 年 North Trail Camper(RT 202。曼彻斯特,缅因州)224 美元/月。

雪地摩托自行车拖车(Winthrop / Augusta)每月 40 美元

“伟大的圣诞礼物”Xbox 360 吉他英雄 (Springfied)

我正在尝试在 Android 中使用 Regex 将字符串拆分为三个部分:

  1. XXX() 之前的文本
  2. (XXX) 中的文字
  3. () XXX 之后的文字

有时不会有价格,()中位置后的文本。

我试过

Pattern p = Pattern.compile("\(([^]*)\)");
Matcher m = p.matcher(title);

但我无法让匹配器在 Android 中工作。当我查看时它总是返回空matcher.group(1)。我目前已将其设置为查找 ( 或 $ 并爆炸也给我单独的字符串。但这不准确且效率低下。

任何帮助都会得到帮助!

4

4 回答 4

4

我怀疑你可以用正则表达式来做到这一点,但不这样做可能更简单。

    String input[] = {
            "Xbox 360 (black) Elite Console 120GB (Mason City Illinois ) $200",
            "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.",
            "Snowmobile Bike trailers (Winthrop / Augusta) $40 Monthly",
            "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)"
    };
    for (String s : input) {
        int lastClose = s.lastIndexOf(')');
        int lastOpen = s.lastIndexOf('(', lastClose);
        System.out.println(s.substring(0, lastOpen).trim() +
                "~" + s.substring(lastOpen + 1, lastClose).trim() +
                "~" + s.substring(lastClose + 1).trim());
    }

印刷

Xbox 360 (black) Elite Console 120GB~Mason City Illinois~$200
$200 2013 North Trail Camper~RT 202. Manchester, Maine~$224/mo.
Snowmobile Bike trailers~Winthrop / Augusta~$40 Monthly
"Great Xmas Gift" XBox 360 Guitar Hero~Springfied~
于 2012-12-19T18:05:49.863 回答
1

[编辑]我不会使用正则表达式来解决这个问题;相反,我会简单地使用该String#lastIndexOf(...)方法来查找最后一个字符的边界()从这些值返回子字符串:

public static String[] splitParens(String s) { 
  if (s == null) return null;
  int indexOfLastOpenParen = s.lastIndexOf('(');
  int indexOfLastCloseParen = s.lastIndexOf(')');
  return new String[] { 
    s.substring(0, indexOfLastOpenParen),
    s.substring(indexOfLastOpenParen + 1, indexOfLastCloseParen),
    s.substring(indexOfLastCloseParen + 1)
  };
} 
public static void main(String args[]) throws Exception { 
  String input[] = { 
    "Xbox 360 (black) Elite Console 120GB (Mason City Illinois ) $200",
    "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.",
    "Snowmobile Bike trailers (Winthrop / Augusta) $40 Monthly",
    "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)"
  };
  Pattern p = Pattern.compile("\\(([^\\)]+)\\)");
  for (String s : input) { 
    System.out.println(Arrays.asList(splitParens(s)));
  }
  // =>
  // [Xbox 360 (black) Elite Console 120GB , Mason City Illinois ,  $200]
  // [$200 2013 North Trail Camper , RT 202. Manchester, Maine,  $224/mo.]
  // [Snowmobile Bike trailers , Winthrop / Augusta,  $40 Monthly]
  // ["Great Xmas Gift" XBox 360 Guitar Hero , Springfied, ]
}

当然,需要更多的错误检查(例如,如果没有()?)。

于 2012-12-19T18:00:18.807 回答
1

如果您确定总会有 3 个组,则此表达式将起作用:

(.*)\((.*)\)(.*)

您可以在这里自己尝试:

http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDgsSBlJlY2lwZRiU8y0M/index.html

于 2012-12-19T17:52:12.727 回答
1

不确定是否需要使用正则表达式,但如果不需要,为什么不使用String.split。然后您可以使用"\\(|\\)"在括号中拆分字符串,然后从创建的字符串数组中获取各个部分。

于 2012-12-19T17:55:03.720 回答