我正在尝试匹配公司名称并忽略测量/数量。但我遇到了一些麻烦。
示例数据:
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 :(得分: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 +)
^ - &gt;用于匹配数据的开始,因为测量数据在行的开头。
[0-9。] + - &gt;匹配测量/数量数据中的一个或多个数字,其中可包括点字符。
[a-zA-Z \“] {0,2} - &gt;这匹配G,M,mm等数据的单位,”根据给定的数据,它可以具有0到2的长度。 “8 Outlet ......”行没有任何单位因此我不得不使用{0,2}其他人可以使用{1,2}。为了避免将“8Ware ...”作为您不想匹配的测量数据进行匹配,我不得不将上限限制为2。
\ s +只是在测量数据后吃掉一个或多个空格。
所以整个正则表达式匹配然后被$ 2替换,这意味着只有正则表达式的第二部分(。*)
捕获的数据希望澄清一下。如果您需要进一步解释任何部分,请告诉我。