2009-09-17 3 views
36

Метод JDK String.trim() довольно наивный и только удаляет управляющие символы ascii.Как правильно обрезать пробелы из строки в Java?

Apache Commons 'StringUtils.strip() немного лучше, но использует JDK's Character.isWhitespace(), который doesn't recognize non-breaking space as whitespace.

Итак, что было бы самым полным, совместимым с Unicode, безопасным и правильным способом обрезать строку на Java?

И, кстати, есть ли лучше библиотека, чем commons-lang, что я должен использовать для такого рода вещей?

ответ

55

Google сделал guava-libraries доступной в последнее время. Это may have то, что вы ищете:

CharMatcher.inRange('\0', ' ').trimFrom(str) 

эквивалентно String.trim(), но вы можете настроить то, чтобы урезать, обратитесь к JavaDoc.

Например, он имеет its own definition of WHITESPACE, которая отличается от JDK и определяется в соответствии с последним стандартом Unicode, так что вам нужно можно записать в виде:

CharMatcher.WHITESPACE.trimFrom(str) 
+2

Upvoted заставила меня чувствовать себя рывком – itsadok

+0

Спасибо за указатель на гуавы. Я пропустил это. – CPerkins

+1

Совет: ['trimAndCollapseFrom'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html#trimAndCollapseFrom (java.lang.CharSequence,% 20char)) обрезает внешнюю часть строки, а также заменяет повторяющиеся значения внутри строки. –

2

Я всегда находил trim, чтобы работать очень хорошо практически для каждого сценария.

Однако, если вы действительно хотите, чтобы включить больше символов, вы можете изменить метод strip от commons-lang включать не только тест на Character.isWhitespace, но и для Character.isSpaceChar который кажется быть то, что отсутствует. А именно, следующие строки в stripStart и stripEnd соответственно:

  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
  • while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))
7

Я клянусь, что я видел только это после того, как я отправил вопрос: Google только что выпустил Guava, библиотеку основных утилит Java.

Я не пробовал этого, но от того, что я могу сказать, что это полностью соответствует Unicode:

String s = " \t testing \u00a0" 
s = CharMatcher.WHITESPACE.trimFrom(s); 
+2

Ха-ха, я предоставил тот же ответ всего за 5 минут до этого, но затем отредактировал его, чтобы включить точный код, который вам нужно использовать, и просто увидел ваш комментарий, что вы его нашли сами. – CrazyCoder

2

Это действительно трудно определить, что представляет собой белые пространства. Иногда я использую непробиваемые пространства просто для того, чтобы убедиться, что он не раздевается. Поэтому будет сложно найти библиотеку, чтобы делать именно то, что вы хотите.

Я использую свою собственную обрезку(), если я хочу обрезать каждое пустое пространство. Вот функция, я использую для проверки белых пространств,

public static boolean isWhitespace (int ch) 
    { 
    if (ch == ' ' || (ch >= 0x9 && ch <= 0xD)) 
     return true; 
    if (ch < 0x85) // short-circuit optimization. 
     return false; 
    if (ch == 0x85 || ch == 0xA0 || ch == 0x1680 || ch == 0x180E) 
     return true; 
    if (ch < 0x2000 || ch > 0x3000) 
     return false; 
    return ch <= 0x200A || ch == 0x2028 || ch == 0x2029 
     || ch == 0x202F || ch == 0x205F || ch == 0x3000; 
    } 
+9

Назовите те магические константы. –

+6

ZZ Coder - вы говорите: «Будет сложно найти библиотеку, чтобы делать именно то, что вы хотите». Не правда! Предположим, что вы хотите сопоставить все пробелы _except_ a \ u00a0 (неразрывное пространство). Easy: CharMatcher.WHITESPACE.and (CharMatcher.isNot ('\ u00a0')). TrimFrom (ввод) –

+2

@KevinBourrillion просто хотел отправить большое «спасибо» за «CharMatcher.WHITESPACE». 'String # trim()' терпит неудачу с Unicode. –

0

я сделал небольшие изменения по методе Явы облицовки() и он поддерживает метод не-ASCII characters.This работает быстрее, чем большинство реализаций.

public static String trimAdvanced(String value) { 

     Objects.requireNonNull(value); 

     int strLength = value.length(); 
     int len = value.length(); 
     int st = 0; 
     char[] val = value.toCharArray(); 

     if (strLength == 0) { 
      return ""; 
     } 

     while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) { 
      st++; 
      if (st == strLength) { 
       break; 
      } 
     } 
     while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) { 
      len--; 
      if (len == 0) { 
       break; 
      } 
     } 


     return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value; 
    } 
Смежные вопросы