在java中,Pattern.matches()与不强制转换为字符串的字符数组匹配 脚本
我需要对照字符数组检查正则表达式模式(在java中,Pattern.matches()与不强制转换为字符串的字符数组匹配 脚本,java,arrays,regex,char,Java,Arrays,Regex,Char,我需要对照字符数组检查正则表达式模式(char[])。出于安全考虑,我不允许将字符数组强制转换为字符串。Java的Pattern.matches()方法设计为接受一个模式和一个字符串。此外,regex模式从另一个源传递给我,并且将发生变化(不是常量) 这不起作用: //此模式来自另一个我无法控制的源。它可能会改变。 字符串模式=“^(.)\\1+$”; char[]exampleArray=新字符[4]; 示例数组[0]=“b”; 示例数组[1]=“l”; 示例数组[2]=“a”; 示例数组[3
char[]
)。出于安全考虑,我不允许将字符数组强制转换为字符串。Java的Pattern.matches()方法设计为接受一个模式和一个字符串。此外,regex模式从另一个源传递给我,并且将发生变化(不是常量)
这不起作用:
//此模式来自另一个我无法控制的源。它可能会改变。
字符串模式=“^(.)\\1+$”;
char[]exampleArray=新字符[4];
示例数组[0]=“b”;
示例数组[1]=“l”;
示例数组[2]=“a”;
示例数组[3]=“h”;
//对于这个模式,应该返回true,但是我不能传入char[]。
布尔匹配=Pattern.matches(Pattern,exampleArray);
思想
我试图解构regex模式并检查模式每个部分的数组,但解释模式每个部分所需的条件逻辑阻碍了我。例如:假设模式包含类似“(..{5,10}”
的内容。然后我只需要检查char[]
长度。但是,如果它包含“^B(..{5,10}X”
,那么我需要做一些非常不同的事情。感觉有太多的可能性可以有效地解构regex模式并解释每种可能性(这就是为什么我总是使用pattern.matches()
)
问题:
在不将字符数组转换为字符串或创建字符串的情况下,根据字符数组检查正则表达式模式的最有效方法是什么?如果有人可以访问机器内存,那么问题可能远远超出密码的发现
boolean matches=Pattern.matches(Pattern,新字符串(exampleArray))代码>如果有人可以访问机器的内存,那么问题可能远远超出密码的发现
boolean matches=Pattern.matches(Pattern,新字符串(exampleArray))
Pattern.matches接受常规字符序列。例如,您可以使用java.nio中的CharBuffer代替String
boolean matches = Pattern.matches(pattern, CharBuffer.wrap(exampleArray));
CharBuffer.wrap不会在内存中创建密码的额外副本,因此在所有选项中,它是最安全的。Pattern.matches接受常规的CharSequence。例如,您可以使用java.nio中的CharBuffer代替String
boolean matches = Pattern.matches(pattern, CharBuffer.wrap(exampleArray));
CharBuffer.wrap不会在内存中创建密码的额外副本,因此在所有选项中,它是最安全的。是什么让你认为char[]
不在堆中?这是一个好的观点,也许我的措辞不好。对于密码验证而言,这更像是一种安全最佳实践。堆上的存在/不存在不是需求背后的驱动因素。我已经更新了我的问题。下面是一个为什么要求我避免使用字符串的示例:我知道。是否允许使用StringBuilder
?如果是这样,您可以使用重载,然后调用长度为0
的StringBuilder#setLength
来清除它。如果可以@JacobG,我会在这里投票表决您的评论,因为你把我送到了正确的方向。感谢您的快速反应和想法!用这个选项和下面的CharBuffer
选项回到我的技术负责人那里。是什么让你认为char[]
还没有在堆中?我的观点是好的,可能是不好的措辞。对于密码验证而言,这更像是一种安全最佳实践。堆上的存在/不存在不是需求背后的驱动因素。我已经更新了我的问题。下面是一个为什么要求我避免使用字符串的示例:我知道。是否允许使用StringBuilder
?如果是这样,您可以使用重载,然后调用长度为0
的StringBuilder#setLength
来清除它。如果可以@JacobG,我会在这里投票表决您的评论,因为你把我送到了正确的方向。感谢您的快速反应和想法!使用此选项和下面的CharBuffer
选项返回我的技术负责人。虽然我同意,但要求仍在我身上。此外,我明确地试图避免对字符串进行强制转换。没有强制转换,在一天结束时,字符串是一个字符序列。这是肯定的。从技术上说,你是对的。您并没有强制转换为字符串,但该要求是基于完全避免创建字符串对象,并且您在这里所拥有的内容将创建一个字符串。我将更新我的问题,使之更具体。虽然我同意,但要求仍在我身上。此外,我明确地试图避免对字符串进行强制转换。没有强制转换,在一天结束时,字符串是一个字符序列。这是肯定的。从技术上说,你是对的。您并没有强制转换为字符串,但该要求是基于完全避免创建字符串对象,并且您在这里所拥有的内容将创建一个字符串。我会更新我的问题,使之更具体。是的,这样更好,这样更好