我想编写一个库来从给定的正则表达式生成一个String。但是,如果正则表达式使用了否定的字符类,我会遇到问题,例如[^a-z]
。在这种情况下,我必须在生成的字符串中放置一个与[a-z]
不匹配的字符。此外,我希望能够定义一组优选使用的字符,例如,可打印字符集。
问题
如何生成未包含在给定数组/集合中的随机字符?如何在此过程中更喜欢字符组?
图书馆中的现有功能会很棒,但是我找不到它。
这是我解决问题的方法,但我想知道是否有更好的算法。此外,我的算法不喜欢给定的字符集,主要是因为我不知道如何检查字符是否可打印或如何获得可打印字符的数组/集合/可迭代。
private void run() {
int i = 1024;
System.out.println(getFirstLegalChar(createExampleIllegalCharArray(i)));
System.out.println((char) i);
}
private char getFirstLegalChar(char[] illegalCharArray) {
for (int i = 0; true; i++) {
if (!contains(illegalCharArray, (char) i)) {
return (char) i;
}
}
}
private char[] createExampleIllegalCharArray(int size) {
char[] illegalCharArray = new char[size];
for (int i = 0; i < illegalCharArray.length; i++) {
illegalCharArray[i] = (char) i;
}
return illegalCharArray;
}
private boolean contains(char[] charArray, char c) {
for (int j = 0; j < charArray.length; j++) {
if (charArray[j] == c) {
return true;
}
}
return false;
}
答案 0 :(得分:1)
您可以查看可打印和不可打印字符的列表 Juniper
我已经检查了一些事情并提出了一个你可以检查的解决方案
public static void main(String[] args) {
final char RECORD_SEPARATOR = 0x1e;
final char END_OF_TEXT = 0x03;
System.out.println(isPrintableChar(RECORD_SEPARATOR));
System.out.println(isPrintableChar(END_OF_TEXT));
System.out.println(isPrintableChar('a'));
}
public static boolean isPrintableChar( char c ) {
Character.UnicodeBlock block = Character.UnicodeBlock.of( c );
return (!Character.isISOControl(c)) &&
c != KeyEvent.CHAR_UNDEFINED &&
block != null &&
block != Character.UnicodeBlock.SPECIALS;
}
我的输出为
false
false
true