2015-09-23 71 views
1

我想寫一個庫來從給定的正則表達式生成字符串。但是,如果正則表達式使用否定字符類,如[^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

您可以檢查打印和非打印字符名單在http ://www.juniper.net/documentation/en_US/idp5.1/topics/reference/general/intrusion-detection-prevention-custom-attack-object-extended-ascii.html – Prashant

+0

我發現,[有非打印unicode characters](https://en.wikipedia.org/wiki/Unicode_control_characters)。列出可打印字符的Java方法將非常棒。 –

+0

我不認爲java庫有這樣的方法。你可以設計你的。 – Prashant

回答

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