修剪空格

时间:2014-06-01 00:07:12

标签: java regex

我知道String的trim()函数,我试图在我自己实现它以更好地理解正则表达式。以下代码似乎不适用于Java。任何输入?

private static String secondWay(String input) {
  Pattern pattern = Pattern.compile("^\\s+(.*)(\\s$)+");
  Matcher matcher = pattern.matcher(input);
  String output = null;
  while(matcher.find()) {
    output = matcher.group(1);
    System.out.println("'"+output+"'");
}
return output;
}

的输出
input = "    This is a test    " is 'This is a test   '

我可以使用像

这样的替代方式来实现
private static final String start_spaces = "^(\\s)+";
private static final String end_spaces = "(\\s)+$";
private static String oneWay(String input) {
       String output;
       input = input.replaceAll(start_spaces,"");
       output = input.replaceAll(end_spaces,"");
       System.out.println("'"+output+"'");
       return output;
}

输出准确

'This is a test'

我想修改我的第一个正确运行方法并返回结果。

感谢任何帮助。 谢谢:))

2 个答案:

答案 0 :(得分:3)

您的模式不正确,它匹配起始空格,您的输入(greedy)匹配到最后一个空格,然后它捕获字符串末尾的最后一个空格。

您需要以下内容,.*?以及非贪婪匹配。

Pattern pattern = Pattern.compile("^\\s+(.*?)\\s+$");

正则表达式:

^              # the beginning of the string
\s+            # whitespace (\n, \r, \t, \f, and " ") (1 or more times)
(              # group and capture to \1:
 .*?           # any character except \n (0 or more times)
)              # end of \1
\s+            # whitespace (\n, \r, \t, \f, and " ") (1 or more times)
$              # before an optional \n, and the end of the string

请参阅Demo

编辑:如果要将前导和尾随空白捕获到组中,只需在它们周围放置一个捕获组()

Pattern pattern = Pattern.compile("^(\\s+)(.*?)(\\s+)$");
  • 1包含前导空格
  • 群组2包含您的匹配文字
  • 3包含尾随空格

仅供参考,为了替换前导/尾随空格,您可以在一行中实现此目的。

input.replaceAll("^\\s+|\\s+$", "");

答案 1 :(得分:3)

我发现您使用的是PatternMatcher,但这是最简单的方法:

private static String secondWay(String input) {
    String pattern = "^\\s+|\\s+$"; // notice it's a string
    return input.replaceAll(pattern, ""); 
}

正则表达式是^\\s+|\\s+$匹配:

  • 所有开始空格(^表示开始,\\s+表示空白)
  • |表示或)
  • 所有结束的空格($表示行尾)