2017-02-26 683 views
0

正在嘗試匹配公司名稱並忽略測量值/數量。但是我有點麻煩。正則表達式匹配單詞但不包含某些字符的數字

示例數據:

8G Kingston Single DDR3-1600 CL11 Desktop RAM (KVR16N11/8) 
8 Outlet Belkin Surge Protector With 2 Meter Cord 
0.5M Yellow CAT6 Network Cable 
100" Intact 16x -R DVD 
15.6" Topload Notebook (Black) 
120mm Aluminum Filter Silver 
8P TP-Link 10/100 Desktop Switch 
8Ware 0.5M CAT5E Network Cable 
Acer Aspire Alpha 12" QHD IPS Display Intel Core i7 Touch Laptop 
ACER Aspire E5 15.6" HD Intel Core i5 Laptop 
Asus SDRW-08D2S-U Slim External USB 2.0 DVD Read/Writer - Black 

我希望能符合公司的名稱,但忽略了千兆字節(G)個位數,100" ,15.6" 令牌等

所以最好它會匹配:

Kingston Single DDR3-1600 CL11 Desktop RAM (KVR16N11/8) 
Outlet Belkin Surge Protector With 2 Meter Cord 
Yellow CAT6 Network Cable 
Intact 16x -R DVD 
Topload Notebook (Black) 
Aluminum Filter Silver 
TP-Link 10/100 Desktop Switch 
8Ware 0.5M CAT5E Network Cable 
Acer Aspire Alpha 12" QHD IPS Display Intel Core i7 Touch Laptop 
ACER Aspire E5 15.6" HD Intel Core i5 Laptop 
Asus SDRW-08D2S-U Slim External USB 2.0 DVD Read/Writer - Black 

我調整了下面的表達式,但我匹配mm(120mm線),因爲我想要8Ware匹配。

+0

你已經嘗試過任何表達式嗎?請編輯你試過的問題,這樣我們可以幫忙,而不是爲你編寫正則表達式。 – Theo

回答

1

根據您提供的數據,我提出了一個可以使用的正則表達式。以下是您可以運行的示例代碼,並看到它打印出您想要的結果。

public static void main(String[] args) { 

    List<String> dataList = new ArrayList<String>(); 
    dataList.add("8G Kingston Single DDR3-1600 CL11 Desktop RAM (KVR16N11/8)"); 
    dataList.add("8 Outlet Belkin Surge Protector With 2 Meter Cord"); 
    dataList.add("0.5M Yellow CAT6 Network Cable"); 
    dataList.add("100\" Intact 16x -R DVD"); 
    dataList.add("15.6\" Topload Notebook (Black)"); 
    dataList.add("120mm Aluminum Filter Silver"); 
    dataList.add("8P TP-Link 10/100 Desktop Switch"); 
    dataList.add("8Ware 0.5M CAT5E Network Cable"); 
    dataList.add("Acer Aspire Alpha 12\" QHD IPS Display Intel Core i7 Touch Laptop"); 
    dataList.add("ACER Aspire E5 15.6\" HD Intel Core i5 Laptop"); 
    dataList.add("Asus SDRW-08D2S-U Slim External USB 2.0 DVD Read/Writer - Black"); 

    System.out.println("Before:"); 
    for (String s : dataList) { 
     System.out.println(s); 
    } 
    System.out.println(); 
    System.out.println("After:"); 
    for (String s : dataList) { 
     System.out.println(s.replaceAll("(^[0-9.]+[a-zA-Z\"]{0,2}\\s+)(.*)", "$2")); 
    } 

} 

以下是該程序在運行時的輸出,這正是您想要的。

Before: 
8G Kingston Single DDR3-1600 CL11 Desktop RAM (KVR16N11/8) 
8 Outlet Belkin Surge Protector With 2 Meter Cord 
0.5M Yellow CAT6 Network Cable 
100" Intact 16x -R DVD 
15.6" Topload Notebook (Black) 
120mm Aluminum Filter Silver 
8P TP-Link 10/100 Desktop Switch 
8Ware 0.5M CAT5E Network Cable 
Acer Aspire Alpha 12" QHD IPS Display Intel Core i7 Touch Laptop 
ACER Aspire E5 15.6" HD Intel Core i5 Laptop 
Asus SDRW-08D2S-U Slim External USB 2.0 DVD Read/Writer - Black 

After: 
Kingston Single DDR3-1600 CL11 Desktop RAM (KVR16N11/8) 
Outlet Belkin Surge Protector With 2 Meter Cord 
Yellow CAT6 Network Cable 
Intact 16x -R DVD 
Topload Notebook (Black) 
Aluminum Filter Silver 
TP-Link 10/100 Desktop Switch 
8Ware 0.5M CAT5E Network Cable 
Acer Aspire Alpha 12" QHD IPS Display Intel Core i7 Touch Laptop 
ACER Aspire E5 15.6" HD Intel Core i5 Laptop 
Asus SDRW-08D2S-U Slim External USB 2.0 DVD Read/Writer - Black 

就像我上面說的,我已經給了你一個基地正則表達式,你可以把它在你的實際數據基礎,如果萬一你有更多的調整,否則你是好了。

EDIT1:

確定的要求,在註釋,編輯的答案,包括正則表達式的解釋。

(^ [0-9。] + [A-ZA-Z \「] {0,2} \ S +)(。*)

正則表達式包括兩個部分:第一部分(^ [0 -9。] + [a-zA-Z \「] {0,2} \ s +)嘗試匹配測量值/量值數據。第二部分只是試圖匹配剩下的數據。僅僅將第一部分作爲第二部分(。*)進行詳細說明是非常簡單的。

(^ [0-9。] + [A-ZA-Z \「] {0,2} \ S +)

^- >是作爲測量數據是在數據的開始匹配該行的開頭

[0-9。] + - >匹配的數字在測量/量的數據的一個或多個可包括一個點字符

[A-ZA-Z \ 「] {0,2} - >這與數據單位(如G,M,mm)匹配,根據給定的數據可以有0到2的長度。例如,」8 Outlet ...「行沒有任何單位因此我必須使用{0,2},否則可能會使用{1,2}。爲避免匹配「8Ware ...」作爲測量數據,你不想匹配,我不得不將限制的上限限制爲2.

\ s +是在測量數據之後吃掉一個或多個空間。

所以整個正則表達式匹配,然後通過$ 2代替,這意味着僅由正則表達式的第二部分捕獲的數據(。*)

希望有所闡明。如果您需要進一步解釋任何部分,請告知我。

+0

謝謝你的完美。你可以用那個查詢中的{0,2}來解釋嗎?這是說匹配0或2次嗎?我最後也沒有(。*)。 –

+0

@LisaAnna:更新了包含正則表達式解釋的答案。希望這應該是好的。 –

相關問題