Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,Pattern.matches()与不强制转换为字符串的字符数组匹配 脚本_Java_Arrays_Regex_Char - Fatal编程技术网

在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
选项返回我的技术负责人。虽然我同意,但要求仍在我身上。此外,我明确地试图避免对字符串进行强制转换。没有强制转换,在一天结束时,字符串是一个字符序列。这是肯定的。从技术上说,你是对的。您并没有强制转换为字符串,但该要求是基于完全避免创建字符串对象,并且您在这里所拥有的内容将创建一个字符串。我将更新我的问题,使之更具体。虽然我同意,但要求仍在我身上。此外,我明确地试图避免对字符串进行强制转换。没有强制转换,在一天结束时,字符串是一个字符序列。这是肯定的。从技术上说,你是对的。您并没有强制转换为字符串,但该要求是基于完全避免创建字符串对象,并且您在这里所拥有的内容将创建一个字符串。我会更新我的问题,使之更具体。是的,这样更好,这样更好