Java регулярное выражение, чтобы отфильтровать не английский текст - PullRequest
2 голосов
/ 01 июня 2011

Я нашел несколько ссылок на отфильтровывание регулярных выражений не на английском языке, но нет из них в Java, за исключением того факта, что они все ссылаются на несколько различных проблем, чем чтоЯ пытаюсь решить:

  1. Заменить все неанглийские символы пробелом.
  2. Создать метод, который возвращает true, если строка содержит любой неанглийский символ.

Под «английским текстом» я подразумеваю не только фактические буквы и цифры, но и знаки препинания.

Пока что я смог прийти к цели №1 очень просто:

String.replaceAll("\\W", " ")

На самом деле, все так просто, что я подозреваю, что что-то упустил ... Вы замечаете какие-либо предостережения в вышеприведенном?

Что касается цели №2, я мог бы просто1021 * строка после выше replaceAll(), затем проверьте, не пусто ли оно.Но ... Есть ли более эффективный способ сделать это?

Ответы [ 4 ]

4 голосов
/ 01 июня 2011

На самом деле, настолько просто, что я подозреваю, что что-то упустил ... Вы замечаете какие-либо предостережения в приведенном выше?

\W эквивалентно [^\w]\w эквивалентно [a-zA-Z_0-9].Использование \W заменит все , которое не является буквой, цифрой или символом подчеркивания как символы табуляции и символы новой строки.Вопрос о том, действительно ли это проблема, зависит от вас.

Под "английским текстом" я подразумеваю не только фактические буквы и цифры, но и знаки препинания.

В этом случаевы можете захотеть использовать класс символов, который пропускает знаки препинания;что-то вроде

[^\w.,;:'"]

Создайте метод, который возвращает истину, если строка содержит любой неанглийский символ.

Используйте Pattern иMatcher.

Pattern p = Pattern.compile("\\W");

boolean containsSpecialChars(String string)
{
    Matcher m = p.matcher(string);
    return m.find();
}
2 голосов
/ 24 февраля 2016

Это работает для меня

  private static boolean isEnglish(String text) {
        CharsetEncoder asciiEncoder = Charset.forName("US-ASCII").newEncoder();
        CharsetEncoder isoEncoder = Charset.forName("ISO-8859-1").newEncoder();
        return  asciiEncoder.canEncode(text) || isoEncoder.canEncode(text);
    }
1 голос
/ 22 июня 2015

Вот мое решение. Я предполагаю, что текст может содержать английские слова, знаки препинания и стандартные символы ascii, такие как #,%, @ и т. Д.

private static final String IS_ENGLISH_REGEX = "^[ \\w \\d \\s \\. \\& \\+ \\- \\, \\! \\@ \\# \\$ \\% \\^ \\* \\( \\) \\; \\\\ \\/ \\| \\< \\> \\\" \\' \\? \\= \\: \\[ \\] ]*$";

private static boolean isEnglish(String text) {
		if (text == null) {
			return false;
		}
		return text.matches(IS_ENGLISH_REGEX);
	}
0 голосов
/ 01 июня 2011

Предполагая, что английское слово состоит из символов из: [a-zA-Z_0-9]

Чтобы вернуть true, если строка содержит любой не английский символ, используйте string.matches:

return !string.matches("^\\w+$");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...