从字符串中删除某个模式

时间:2017-03-28 02:13:58

标签: java regex string

我有一个想要读入IDE的csv文件,其格式为:

Boston (MA), New York City (NY, CT, NJ)
New York City (NY, CT, NJ), Philadelphia (PA, NJ)
...

我将读取该行并将该字符串拆分为逗号,创建一个字符串数组,但我只想要城市名称

我想删除围绕它的所有括号。有什么方法可以做到吗?

4 个答案:

答案 0 :(得分:1)

使用find()方法,您可以使用此模式:

[^(,]*(?:\\([^)]*\\)[^(,]*)*

demo

答案 1 :(得分:1)

您可以使用Regular Expression

执行此类操作
String fileLineString = "Boston (MA), New York City (NY, CT, NJ)";

final Pattern REMOVE_BRACKETED = Pattern.compile("\\(.+?\\)");
Matcher matcher = REMOVE_BRACKETED.matcher(fileLineString);
String res = matcher.replaceAll("").replaceAll(" , ", ",").trim();
String[] cities = res.split(",");

//Display the cities Array in Console...
for (int i = 0; i < cities.length; i++) {
    System.out.println(cities[i]);
}

控制台输出将是:

Boston
New York City

要使用的RegEx模式基本上这样做,找到任何打开的括号\\(以及任何单个或多个字符(换行符除外),无论在结束括号.+?之前有多少\\)遇到了。

然后我们通过 Matcher.matcher()方法运行此模式。

然后我们声明一个String变量(名为 res )并使用 Matcher.replaceAll()方法返回的字符串对其进行初始化,该方法替换了每个子序列。输入序列将模式与给定的替换字符串匹配,我们在方法中使用&#34;&#34; 来表示我们要替换匹配的内容。然后我们应用 String.replaceAll()方法(如:.replaceAll(" , ", ","))来清除逗号分隔符前后不需要的空格,最后我们应用字符串.trim()从整个结果字符串中删除任何前导或尾随空格。如果有的话。

现在我们只需使用 String.split()方法创建一个名为 cities 的字符串数组。其余的代码我很确定你能搞清楚。

<强>更新

只是因为这种方式让我有点烦恼......

上面的代码适用于包含未嵌套的括号的字符串,但如果有嵌套的括号则会失败。如果您发现您的字符串不时包含嵌套的括号,那么您可以使用下面的方法删除甚至嵌套的括号。

String fileLineString = "Boston (MA), New York City (NY, (CT), NJ)";
Pattern pattern = Pattern.compile("\\([^()]*\\)");
String wasString;
String res = fileLineString;
do {
    wasString = res;
    res = pattern.matcher(wasString).replaceAll("");
} while (!wasString.equals(res));

res = res.replaceAll("\\s+,\\s+", ",").trim();
String[] cities = res.split(",");

//Display the cities Array in Console...
for (String citie : cities) {
    System.out.println(citie);
}

输出到控制台将是:

Boston
New York City

如果您想在正则表达式中添加其他括号,例如{},[],甚至&lt;&gt;然后你可以这样做:

  • 仅限括号:"\\([^()]*\\)"
  • 括号和卷曲括号:"\\([^()]*\\)|\\{[^{}]*\\}"
  • 括号,卷曲括号和方括号: "\\([^()]*\\)|\\{[^{}]*\\}||\\[[^\\[\\]]*\\]"
  • 圆括号,卷曲括号,方括号和雪佛龙支架: "\\([^()]*\\)|\\{[^{}]*\\}||\\[[^\\[\\]]*\\]|\\<[^<>]*\\>"

对于最后一个,在字符串中遇到四个括号中的哪一个并不重要,即使任何一个或全部嵌套在另一个中,它们的内容也将从字符串中删除。

答案 2 :(得分:0)

如果我处理这个问题,我将使用IDE正则表达式替换所有“)”,“to”)\ n“,然后你将文档转换为多行,用逗号分隔。然后,您可以轻松获得国家和城市。

答案 3 :(得分:0)

你需要尝试这样的事情。

示例代码

String str = "Boston (MA), New York City (NY, CT, NJ),New York City (NY, CT, NJ), Philadelphia (PA, NJ)";
Pattern bracket = Pattern.compile("(.*?)\\(.*?\\),?");
Matcher matcher = bracket.matcher(str);
while(matcher.find()) {
    System.out.println(matcher.group(1).trim());
}

它只返回城市名称。