在java中,针对没有强制转换为String的char数组的Pattern.matches()



场景

我需要对照字符数组(char[](检查正则表达式模式。出于安全考虑,不允许将字符数组强制转换为字符串。Java的Pattern.matches((方法被设计为采用模式和字符串。此外,regex模式是从另一个源传递给我的,并且会发生变化(不是恒定的(。

这不起作用:

// 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); 

思想

我试图解构regex模式,并检查模式每个部分的数组,但解释模式每个部分所需的条件逻辑阻碍了我。例如:假设模式包含类似"(.){5,10}"的内容。那么我只需要检查char[]的长度。但是,如果它包含"^B(.){5,10}X",那么我需要做一些非常不同的事情。感觉有太多的可能性来有效地解构regex模式并解释每种可能性(这正是我一直使用Pattern.matches()的原因(。

问题

在不将字符数组强制转换为String或创建String的情况下,根据字符数组检查regex模式的最有效方法是什么?

Pattern.matches接受一个通用的CharSequence。例如,您可以使用java.nio中的CharBuffer而不是String。

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

CharBuffer.wrap不会在内存中创建额外的密码副本,因此在所有选项中,它是最安全的。

如果有人可以访问机器的内存,那么问题可能远远不止于密码的泄露。

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

最新更新