2012-07-12 3 views
0

Я получил эту Regex, что выходит из заводной кода:Groovy Regex: Что делает тильда в классе персонажей?

(?:[^\p{Alnum}äöü**~D~V~\~_**]|^) 

(?:sometext|s\.t\.) 

(?:[^\p{Alnum}äöü**~D~V~\~_**]|$$) 

Единственное, что я не понимаю, эта часть:

**~D~V~\~_** 

Что DOAS тильды делать там? Это ошибка? Или просто какой-то переключатель для класса символов?

Мое понимание состоит в том, что первая и третья строки соответствуют границам слов, а вторая соответствует рассматриваемому тексту (в длинной и короткой форме).

Я пробовал искать это (и искать здесь, конечно), но, к сожалению, плитка принадлежит к «совпадению этого» оператора в groovy, поэтому все, что я нашел здесь и там, было общей информацией о том, как что-то повторить.

+0

Повторно пометить вопрос, чтобы указать, в какой среде вы работаете. Java? C#? И т. Д. – Utkanos

+0

@Utkanos Лучше сейчас? Эта вещь широко из моей нормальной работы, поэтому я не знал, что это имело значение. – barigorokarl

ответ

2

Тильда не имеет особого значения в строгих или регулярных выражениях 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 

Я бы выбросить эти regexs. Они явно ошибаются и запутываются дополнительными персонажами. Границы слов можно сопоставить с \b, и \p{Alnum}äöü должен почти наверняка быть \p{Alphabetic}\p{Digit} для правильной обработки юникода.

+0

К сожалению, у меня нет никакой власти над этим, я просто должен объяснить это моему менеджеру проекта. Но я могу сделать это сейчас, спасибо :-) – barigorokarl