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} правильно обрабатывать юникод.

Другие вопросы по тегам