В границе слова Regex\b возникают проблемы с умлаутами (специальные символы на немецком языке)

Возможный дубликат:
Javascript RegExp + границы Word + символы Unicode

В ECMA Script regex (проверено здесь для справки: http://regexpal.com/) Я получаю ложные срабатывания со слоями (используя \b) и умлаут. Например

regex \bPflanzen\b

не должен соответствовать "Pflanzenöl", но это так. Если я изменил ö на oe, все будет работать. Regex, похоже, не считает умлауты частью слов, хотя они и есть на многих языках.

Какое лучшее обходное решение?

Ответы

Ответ 1

Двигатели Regex имеют разные представления о том, как работают классы сокращенных символов. \b тесно связан с \w, который почти бесполезен почти во всех задачах регулярных выражений, но, к сожалению, достаточно "достаточно хорош" для многих случаев, чтобы оправдать его дальнейшее существование.

В этом случае JavaScript учитывает только ASCII [a-zA-Z0-9_] для \w, а так как \b соответствует местоположению между символом из \w и тем, что вы не получите, наблюдаемое поведение.

Обычным обходным решением является использование lookaround вместо \b:

(?<![a-zA-ZäöüßÄÖÜ])Pflanzen((?![a-zA-ZäöüßÄÖÜ]))

Однако JavaScript также не поддерживает lookbehind, поэтому нам нужно сделать что-то еще:

(^|[^a-zA-ZäöüßÄÖÜ])Pflanzen(?![a-zA-ZäöüßÄÖÜ])

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