2013-02-15 3 views
2

Регулярное выражение, в частности, для негативных шаблонов с просмотром, похоже, не работает должным образом в коде Android 2.1.Regex negative lookahead в Android 2.1

Смотрите пример ниже:

private String parseString(String regex, String raw) { 
    StringBuffer sb = new StringBuffer(); 
    Matcher m = Pattern.compile(regex).matcher(raw); 
    m.matches(); 
    if (m.find()) sb.append(m.group()); 
    return sb.toString(); 
} 

// Using the helper method above: 
// Looking for 4-digit numeric strings within a text 
String regex = "(\\d{4})(?!\\d)"; 
String text = "Looking for a 4-digit string 1234 in here!"; 
Log.i("Test", "[" + parseString(regex, text) + "]"); 

На Android 2.1, результат приходит как:

I/Test ( 451): [] 

На Android 2.2, это:

I/Test ( 451): [1234] 

Кто-нибудь знает причину для этого?

+0

Прежде чем кто спрашивает, отрицательный шаблон используется для обеспечения того, чтобы \ D {4} не поймать строки, как «123456 », возвращая« 1234 ». –

+0

Вне темы, но ... Если вас интересует только первый результат, почему вам нужен цикл while? 'M.find(); sb.append (m.group()); 'должно быть достаточно. – Leri

+0

@ bruno.braga: Разделите свои исследования и поощрите их. Но SO - это сайт вопросов и ответов, поэтому принятый способ совместного исследования состоит в том, чтобы задать вопрос, который приведет к исследованию, и ответить на него напрямую с результатом исследования. См. [Здесь] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) для получения дополнительной информации. –

ответ

2

Существует ошибка в регулярном выражении Android, в частности, для негативных шаблонов.

Официальный билет был создан и зафиксирован в Android 2.2 (Froyo): http://code.google.com/p/android/issues/detail?id=17159

Решение:

(а) Не использовать Android 2.1, если вам это нужно; или

(б) Перестройте регулярное выражение без отрицательного шаблона (может грязнее, но должен работать)

+0

Сторона примечания, для справок в будущем: m.matches() требовалась для вызова, но она не подходит для Android 4 + ... просто удалите ее, и она будет работать нормально. –

Смежные вопросы