Groovy Regex: Что делает тильда в классе персонажей?
У меня есть это регулярное выражение, которое выходит из отличного кода:
(?:[^\p{Alnum}äöü**~D~V~\~_**]|^)
(?:sometext|s\.t\.)
(?:[^\p{Alnum}äöü**~D~V~\~_**]|$$)
Единственное, что я не понимаю, это эта часть:
**~D~V~\~_**
Что там делает тильда? Это ошибка? Или просто какой-то переключатель для класса персонажа?
Насколько я понимаю, первая и третья строки соответствуют границам слов, а вторая - соответствующему тексту (в длинной и краткой форме).
Я попытался погуглить это (и искал здесь, конечно), но, к сожалению, тайл принадлежит оператору "match this" в groovy, так что все, что я нашел здесь и там, было общей информацией о том, как что-то переформулировать.
1 ответ
Тильда не имеет никакого особого значения в регулярных выражениях groovy или Java. Groovy вообще не меняет интерпретацию регулярных выражений в Java. Все специальные символы для перечислены на странице справки API для java.util.regex.Pattern
,
Если вы удалите \p{Alnum}
класс персонажа и сбежавшая тильда, вы можете легко увидеть, что ~
не лечится специально:
assert ("D" ==~ "(?:[^äöü~D~V~_])") == false
assert ("V" ==~ "(?:[^äöü~D~V~_])") == false
assert ("~" ==~ "(?:[^äöü~D~V~_])") == false
assert (" " ==~ "(?:[^äöü~D~V~_])") == true
Я бы выбросил эти регулярные выражения. Они явно не правы и запутаны дополнительными персонажами. Границы слова могут быть сопоставлены с \b
и \p{Alnum}äöü
почти наверняка \p{Alphabetic}\p{Digit}
правильно обрабатывать юникод.