2022/07/14 追記
いや、というかやりたいことが
ApacheのStringUtils.strip()だったことに気づきました…よかったよかった…
https://github.com/apache/commons-lang/blob/master/src/main/java/org/apache/commons/lang3/StringUtils.java
追記
1文字だとマッチしないことに気づき
"^[\t\n]*([^\t\n]+(.|\\s)*[^\t\n]+)[\t\n]*$"
から
"^[\t\n]*([^\t\n]*(.|\\s)*[^\t\n]+)[\t\n]*$"
に修正した。
最初のプラスがアスタリスクになった。
大嫌いな正規表現。
前後以外の改行やタブはそのままにするとこがポイント。
めちゃくちゃハマったので記事にしときます。
public static String trimNewline(String str) {
String regex = "^[\t\n]*([^\t\n]*(.|\\s)*[^\t\n]+)[\t\n]*$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.find()) {
return m.group(1);
} else { // 「空文字」や「タブや改行だけで構成された文字列」はマッチせずここにくる
return "";
}
}
Javaの正規表現を調べると
「.」は任意の文字にマッチ
とだけ書いてあるものばかりですが、実は、
改行以外の任意の文字列
だったので、めちゃくちゃハマりました。
System.out.println(trimNewline("\t\n\t\nhoge\t\n\t\n")); // hoge
System.out.println(trimNewline("\t\n\t\nhoge")); // hoge
System.out.println(trimNewline("hoge\t\n\t\n")); // hoge
また、途中に改行やタブが入った、
"\t\n\n\n\t\tho\t\t\nhoge\nge\t\n\t\n"
こちらも、
無事に、前後のみ取り除かれました。