2013-04-06 51 views
0

標準Java API中有沒有一個簡短的手段,它允許我從1行中的字符串1^2^3^4中獲取令牌?我想說第三個元素「3」被提取。我不想要編譯正則表達式的任何東西。讓它在預編譯的正則表達式中傳遞是沒問題的,但每次調用方法時都會不斷編譯正則表達式會傷害CPU。字符串在java中分割/標記化而不編譯正則表達式?

+0

你的意思是你不想使用String.split(),因爲它必須使用一種模式? – 2013-04-06 10:38:47

+0

你能展示一些代碼嗎?我知道這就是你要求的,但是你完全確定CPU有損害,你不僅僅是過早地優化了嗎? – Gothmog 2013-04-06 10:51:21

+0

@Gothmog是的。最後一次使用Java 1.5或1.6進行檢查時,編譯器不會對其進行優化(即:編譯模式並將其替換爲引用)。我假設情況仍然如此。使用hprof,我已經看到了一些簡單的方法,就像一個方法中的正則表達式佔用了很大一部分cpu計算時間。 – Zombies 2013-04-06 11:13:56

回答

3

您可以使用預編譯的Pattern輕鬆拆分;

static Pattern regex = Pattern.compile("\\^"); 

private static String getEntry(String input, int which) 
{ 
    return regex.split(input)[which]; 
} 

...或者交替,只是做直線代碼,而不是使用正則表達式可言,因爲它不會產生非所需的String對象,它應該會更快。

private static String getEntry(String input, int which) 
{ 
    int left, right = -1; 
    do { 
     left = right; 
     right = input.indexOf('^', right+1); 
    } 
    while(which-- > 0 && right >= 0); 

    if(which != -1) 
     return null; 

    if(right == -1) 
     return input.substring(left+1); 

    return input.substring(left+1, right); 
} 
1

您可以使用Pattern.compile編譯Java中的正則表達式,這將產生一個Pattern對象。您可以隨意重複使用該對象,而無需再次編譯正則表達式。只需將編譯後的模式存儲在變量中,以便每次需要時都可以檢索它。

如果您定義的模式匹配^之間的任意數字,則可以使用Pattern.matcher()創建一個與您的輸入相匹配的Matcher對象。 Matcher.group(int)方法會讓您訪問給定輸入中的特定匹配項。

1

有Scanner類可以讓你定義一個分離器字符,所以你可以調用next()函數,直到找到你想要的元素。在這種情況下,不需要使用正則表達式。

相關問題