我知道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'
我想修改我的第一个正确运行方法并返回结果。
感谢任何帮助。 谢谢:))
答案 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)
我发现您使用的是Pattern
和Matcher
,但这是最简单的方法:
private static String secondWay(String input) {
String pattern = "^\\s+|\\s+$"; // notice it's a string
return input.replaceAll(pattern, "");
}
正则表达式是^\\s+|\\s+$
匹配:
^
表示开始,\\s+
表示空白)|
表示或)$
表示行尾)