2015-04-17 23 views
1

目標 - 我需要從我的輸入字符串中檢索所有的十六進制數字。正則表達式 - 查找不包含下一個十六進制數字0的十六進制數字匹配

實施例的輸入和比賽 -

1-輸入= 「0x480x8600x89dfh0x89BABCE」(其中 「」 不包括在輸入端)。 應該產生以下匹配:

  • 0x48
  • 0x860
  • 0x89df
  • 0x89BABCE

我已經試過這種模式(而不是0x480):

"0[xX][\\da-fA-F]+" 

但結果如下ING相符:

  • 0x480
  • 0x89df
  • 0x89BABCE

2-輸入= 「0x0x8600x89dfh0x89BABCE」(其中 「」 不包括在輸入端)。

應該產生以下匹配:

  • 0x860
  • 0x89df
  • 0x89BABCE

就是這樣一個正則表達式的可能嗎?

我知道我可以先使用String.split(「0 [xX]」)分割我的輸入,然後對於每個字符串,我可以編寫邏輯來檢索第一個有效匹配,如果有的話。

但我想知道如果我可以使用模式和匹配器來實現預期的結果。

這是我目前的代碼。

package toBeDeleted; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexTest { 

    public static void main(String[] args) { 
     String pattern = "0[xX][\\da-fA-F]+"; 
     String input = "0x480x860x89dfh0x89BABCE"; 
     Pattern p = Pattern.compile(pattern); 
     Matcher m = p.matcher(input); 
     while (m.find()) { 
      System.out.println("Starting at : " + m.start() 
        + ", Ending at : " + m.end() 
        + ", element matched : " + m.group()); 
     } 

    } 

} 

回答

1

可以使用lookahead檢查下一個字符是不是一個「x」

String pattern = "0[xX]([1-9a-fA-F]|0(?![xX]))+"; 

不提供匹配的爲0x0的第二個例子,雖然。但是,您確實聲明匹配應該排除下一個十六進制數字前面的「0」,所以不太確定爲什麼匹配。

+0

是的你是對的。如果我們優先考慮先前的匹配,則情況1和2是互斥原因,第一種情況應產生0x480,如「0 [xX] [\\ da-fA-F] +」。我會用一句話更新這個問題。並感謝您的迴應。 – Chan

3

一些人,當遇到一個問題,認爲「我知道,我將使用 正則表達式。」現在他們有兩個問題。
- 傑米·薩溫斯基

如果只是用.split("0x"),和粘性0X回每個(非空)的結果,你會做。

+0

我知道你在說什麼。但我只需要知道這樣的正則表達式是否可能。要知道什麼是可能的,與使用最佳選項獲得結果不同。如果我必須編碼,我也會使用拆分方法。但我的面試官有興趣知道我是否知道一個正則表達式是否可以解決這個問題。 – Chan

相關問題