【问题标题】:Cutting a String variable with regex使用正则表达式切割字符串变量
【发布时间】:2016-12-23 03:53:21
【问题描述】:

我有这个字符串变量:

 String a = "Chris Weitz (screenplay), Tony Gilroy (screenplay) Lucasfilm Allison Shearmur Productions Black Hangar Studios";

它可以包含一个或两个用逗号分隔的“Name Surename (job)”模式。

如何使用正则表达式成功地剪切除这些模式之外的所有内容?最后应该是这样的:

a = "Chris Weitz (screenplay), Tony Gilroy (screenplay)";

或者像这样:

a = "Chris Weitt (screenplay)";

谢谢大家。

【问题讨论】:

  • 如果你真的确定逗号分隔你可以使用a.split(",")它会返回字符串数组Chris Weitt (screenplay)
  • 问题是,这仅适用于一种“Name Surename(Job”模式)。第二个永远不会用逗号分隔。
  • 你尝试过什么?基本上你想删除任何其他字符串,但匹配 ([[:alpha:] ]+\([[:alpha:]]+\))?

标签: java regex string replace


【解决方案1】:
String s = "Chris Weitz (screenplay), Tony Gilroy (screenplay) Lucasfilm Allison Shearmur Productions Black Hangar Studios";
Pattern p = Pattern.compile("[^,\\(]+\\([^\\)]+\\)");
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(m.group().trim());
}

【讨论】:

  • 虽然该代码确实有效,但您应该考虑至少添加一个简短的说明。
【解决方案2】:

详细阐述 Gurwinder Singh 的回答......(并更改正则表达式模式)

String s = "Chris Weitz (screenplay), Tony Gilroy (screenplay) Lucasfilm Allison Shearmur Productions Black Hangar Studios";
Pattern p = Pattern.compile("([[:alpha:] ]+\\([[:alpha:]]+\\))");
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(m.group().trim());
}

这个想法是用给定的模式匹配一​​个字符串 - ([[:alpha:] ]+\([[:alpha:]]+\)) - 这基本上可以捕获后面跟着一对括号的任何单词。 - regex101

【讨论】:

    【解决方案3】:

    从最后一个 ) 开始删除(即替换为空白)所有内容:

    str = str.replaceAll("\\)[^)]*$", ")");
    

    正则表达式匹配一个右括号直到最后没有遇到另一个右括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多