Pattern.matches () для массива char без приведения к String в java - PullRequest
1 голос
/ 01 апреля 2020

Сценарий

Мне нужно сравнить шаблон регулярного выражения с массивом символов (char[]). Мне не разрешено приводить массив символов в строку из соображений безопасности. Метод Pattern.matches () Java предназначен для получения шаблона и строки. Кроме того, шаблон регулярного выражения передается мне из другого источника и будет меняться (не является постоянным).

Это не работает:

// This pattern comes from another source, that I do not control. It may change.
String pattern = "^(.)\\1+$"; 

char[] exampleArray = new char[4];
    exampleArray[0] = 'b';
    exampleArray[1] = 'l';
    exampleArray[2] = 'a';
    exampleArray[3] = 'h';

// This should return true, for this pattern, but I cannot pass in a char[].
boolean matches = Pattern.matches(pattern, exampleArray); 

Мысли

I попытался деконструировать шаблон регулярного выражения и проверить массив для каждой части шаблона, но условный лог c, требуемый для интерпретации каждой части шаблона, помешал мне. Например: предположим, что шаблон содержит что-то вроде "(.){5,10}". Тогда мне нужно только проверить длину char[]. Однако, если он содержит "^B(.){5,10}X", мне нужно сделать что-то совсем другое. Кажется, что существует слишком много возможностей для эффективной деконструкции шаблона регулярного выражения и учета каждой возможности (именно поэтому я всегда просто использовал Pattern.matches()).

Вопрос

Что было бы наиболее эффективным способом проверки шаблона регулярного выражения для массива символов без приведения массива символов к строке или создания строки?

Ответы [ 2 ]

4 голосов
/ 01 апреля 2020

Pattern.matches принимает общую последовательность CharSequence. Например, вы можете использовать CharBuffer из java .nio вместо String.

boolean matches = Pattern.matches(pattern, CharBuffer.wrap(exampleArray));

CharBuffer.wrap не будет создавать дополнительную копию пароля в памяти, поэтому из всех вариантов он самый безопасный.

3 голосов
/ 01 апреля 2020

Если у кого-то есть доступ к памяти машины, проблемы могут выйти далеко за рамки раскрытия паролей.

boolean matches = Pattern.matches(pattern, new String(exampleArray));

...