Удалить все не-«символы слова» из строки в Java, оставив акцентированные символы? - PullRequest
66 голосов
/ 23 октября 2009

Очевидно, что при использовании Regex Java-код считает умлауты и другие специальные символы не «словесными».

        "TESTÜTEST".replaceAll( "\\W", "" )

возвращает "ТЕСТ ТЕСТ" для меня. То, что я хочу, это удалить только все по-настоящему не «слова». Любой способ сделать это, не имея что-то вроде

         "[^A-Za-z0-9äöüÄÖÜßéèáàúùóò]"

только чтобы понять, что я забыл?

Ответы [ 6 ]

154 голосов
/ 23 октября 2009

Использовать [^\p{L}\p{Nd}]+ - это соответствует всем (Unicode) символам, которые не являются ни буквами, ни (десятичными) цифрами.

В Java:

String resultString = subjectString.replaceAll("[^\\p{L}\\p{Nd}]+", "");

Edit:

Я изменил \p{N} на \p{Nd}, поскольку первый также соответствует некоторым числовым символам, таким как ¼; последнее не Смотрите это на regex101.com .

7 голосов
/ 14 апреля 2011

Я пытался достичь полной противоположности, когда наткнулся на эту тему. Я знаю, что он довольно старый, но, тем не менее, вот мое решение. Вы можете использовать блоки, см. здесь . В этом случае скомпилируйте следующий код (с правами импорта):

> String s = "äêìóblah"; 
> Pattern p = Pattern.compile("[\\p{InLatin-1Supplement}]+"); // this regex uses a block
> Matcher m = p.matcher(s);
> System.out.println(m.find());
> System.out.println(s.replaceAll(p.pattern(), "#"));

Вы должны увидеть следующий вывод:

правда

# мля

Лучшее

6 голосов
/ 19 июля 2010

Временами вы не хотите просто удалять символы, а просто удалять акценты. Я придумал следующий класс утилит, который я использую в своих веб-проектах на Java REST всякий раз, когда мне нужно включить строку в URL:

import java.text.Normalizer;
import java.text.Normalizer.Form;

import org.apache.commons.lang.StringUtils;

/**
 * Utility class for String manipulation.
 * 
 * @author Stefan Haberl
 */
public abstract class TextUtils {
    private static String[] searchList = { "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß" };
    private static String[] replaceList = { "Ae", "ae", "Oe", "oe", "Ue", "ue",
            "sz" };

    /**
     * Normalizes a String by removing all accents to original 127 US-ASCII
     * characters. This method handles German umlauts and "sharp-s" correctly
     * 
     * @param s
     *            The String to normalize
     * @return The normalized String
     */
    public static String normalize(String s) {
        if (s == null)
            return null;

        String n = null;

        n = StringUtils.replaceEachRepeatedly(s, searchList, replaceList);
        n = Normalizer.normalize(n, Form.NFD).replaceAll("[^\\p{ASCII}]", "");

        return n;
    }

    /**
     * Returns a clean representation of a String which might be used safely
     * within an URL. Slugs are a more human friendly form of URL encoding a
     * String.
     * <p>
     * The method first normalizes a String, then converts it to lowercase and
     * removes ASCII characters, which might be problematic in URLs:
     * <ul>
     * <li>all whitespaces
     * <li>dots ('.')
     * <li>(semi-)colons (';' and ':')
     * <li>equals ('=')
     * <li>ampersands ('&')
     * <li>slashes ('/')
     * <li>angle brackets ('<' and '>')
     * </ul>
     * 
     * @param s
     *            The String to slugify
     * @return The slugified String
     * @see #normalize(String)
     */
    public static String slugify(String s) {

        if (s == null)
            return null;

        String n = normalize(s);
        n = StringUtils.lowerCase(n);
        n = n.replaceAll("[\\s.:;&=<>/]", "");

        return n;
    }
}

Будучи говорящим по-немецки, я также включил правильную обработку умлаутов на немецком языке - список должен легко расширяться для других языков.

НТН

РЕДАКТИРОВАТЬ: Обратите внимание, что может небезопасно включать возвращенную строку в URL. Вы должны как минимум HTML кодировать его, чтобы предотвратить атаки XSS.

2 голосов
/ 23 октября 2009

Ну, вот одно решение, которое я выбрал, но я надеюсь, что есть более элегантное ...

StringBuilder result = new StringBuilder();
for(int i=0; i<name.length(); i++) {
    char tmpChar = name.charAt( i );
    if (Character.isLetterOrDigit( tmpChar) || tmpChar == '_' ) {
        result.append( tmpChar );
    }
}

result заканчивается желаемым результатом ...

1 голос
/ 23 февраля 2011

Возможно, вы захотите сначала удалить акценты и диакритические знаки , а затем в каждой позиции символа проверять, является ли «упрощенная» строка буквой ascii - если это так, исходная позиция должна содержать символы слова если нет, его можно удалить.

0 голосов
/ 09 октября 2013

Вы можете использовать StringUtils из apache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...