Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / String.replaceAll: регулярное выражение не понимает кириллицу / 10 сообщений из 10, страница 1 из 1
01.04.2014, 09:47
    #38601556
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Почему регулярка не понимает кириллицу? Кодировка файла - utf-8.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Test
public void testStringReplaxeAll() {
	String in1 = "qwe asd, ZXC";
	String in2 = "ФЫВ, ЙЦУ ячс";

	String out1 = in1.replaceAll("\\W+", "");
	String out2 = in2.replaceAll("\\W+", "");

	assertEquals("qweasdZXC", out1);
	assertEquals("ФЫВЙЦУячс", out2); // org.junit.ComparisonFailure: expected:<[ФЫВЙЦУячс]> but was:<[]>
}
...
Рейтинг: 0 / 0
01.04.2014, 10:15
    #38601588
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Читать доку по регулярным выражениям в Java
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Начать с определения вашего \W
RTFM \w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]

Затем уделить внимание всему что касается Unicode.
...
Рейтинг: 0 / 0
01.04.2014, 10:26
    #38601606
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Blazkowicz,

Понятно.

Ввело в заблуждение то, что в некоторых других реализациях ядра регулярных выражений (Oracle, Perl) в множество \w попадали также и буквы кириллицы.
...
Рейтинг: 0 / 0
01.04.2014, 10:54
    #38601636
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Возникают дополнительные сложности: если \w можно заменить на [а-яА-Я\w] , то как быть с \b ?
...
Рейтинг: 0 / 0
01.04.2014, 10:55
    #38601637
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
publexusВвело в заблуждение то, что в некоторых других реализациях ядра регулярных выражений (Oracle, Perl) в множество \w попадали также и буквы кириллицы.
Вот тут развернутый ответ. Небольшими манипуляциями можно и добиться желаемого поведения.
http://stackoverflow.com/questions/4304928/unicode-equivalents-for-w-and-b-in-java-regular-expressions
...
Рейтинг: 0 / 0
01.04.2014, 10:58
    #38601640
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
publexusВозникают дополнительные сложности: если \w можно заменить на [а-яА-Я\w] , то как быть с \b ?
Вы документацию дочитали, или на середине бросили?


UNICODE_CHARACTER_CLASS

Код: java
1.
public static final int UNICODE_CHARACTER_CLASS



Enables the Unicode version of Predefined character classes and POSIX character classes.

When this flag is specified then the (US-ASCII only) Predefined character classes and POSIX character classes are in conformance with Unicode Technical Standard #18: Unicode Regular Expression Annex C: Compatibility Properties.

The UNICODE_CHARACTER_CLASS mode can also be enabled via the embedded flag expression (?U).

The flag implies UNICODE_CASE, that is, it enables Unicode-aware case folding.

Specifying this flag may impose a performance penalty.

Since:
1.7
See Also:
Constant Field Values
...
Рейтинг: 0 / 0
01.04.2014, 11:28
    #38601674
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Blazkowicz,

Не работает (Java 1.7):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Test
public void testStringPatternUnicode() {
	Pattern pattern = Pattern.compile("\bФЫВ\b", Pattern.UNICODE_CHARACTER_CLASS);
	Matcher matcher = pattern.matcher("ФЫВФЫВ, ФЫВ");
	assertTrue(matcher.matches()); // java.lang.AssertionError 
}

@Test
public void testStringReplaceAllUnicode() {
	String in1 = "ФЫВФЫВ, ФЫВ";
	String out1 = in1.replaceAll("(?U)\bФЫВ\b", "фыв");
	assertEquals("ФЫВФЫВ, фыв", out1); // org.junit.ComparisonFailure: expected:<ФЫВФЫВ, [фыв]> but was:<ФЫВФЫВ, [ФЫВ]>
}
...
Рейтинг: 0 / 0
01.04.2014, 11:34
    #38601681
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Blazkowicz,

Вариант с синтетической заменой работает, но слишком уж громоздкий:
Код: java
1.
2.
3.
\b => (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}
	[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])
	(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))
...
Рейтинг: 0 / 0
01.04.2014, 11:36
    #38601686
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
publexusНе работает (Java 1.7).
Код: java
1.
2.
3.
4.
5.
6.
@Test
public void testStringPatternUnicode() {
	Pattern pattern = Pattern.compile("\bФЫВ\b", Pattern.UNICODE_CHARACTER_CLASS);
	Matcher matcher = pattern.matcher("ФЫВФЫВ, ФЫВ");
	assertTrue(matcher.matches()); // java.lang.AssertionError 
}



А вот использовали бы IntelliJ IDEA, сразу бы увидели ошибку в регулярке. Во-первых \\b, во-вторых matcher.find()
...
Рейтинг: 0 / 0
01.04.2014, 11:40
    #38601694
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String.replaceAll: регулярное выражение не понимает кириллицу
Спасибо.
Лопухнулся я. Работает все.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / String.replaceAll: регулярное выражение не понимает кириллицу / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]