2011-11-20 46 views
2

我有一个文本文件,并循环尽管像这样的文件:如何提取IP:从字符串渣口

for (int i = 0; i < this.textLines.size(); i++) { 
    String tempString = textLines.get(i); 

所以现在我有一个包含一些tempString这样的:

46.102.241.199:3128 0.2990 Transp. NN N 100% 2011-11-19 17:56:02

我想要的是返回IP:PORT部分,在这种情况下:46.102.241.199:3128

我该怎么做?

+0

你说的“类似”,所有的行都有相同的格式,或将不包含任何IP:PORT? IP:PORT之前是否会有不同的数据? –

+0

您的标签建议您要使用正则表达式,但是为什么在更简单的解决方案时可以使用更复杂的解决方案?难道你不能只做tempString.substring(0,tempString.indexOf(''));?当然,你没有以这种方式检查字符串的正确格式,但是你需要吗?我会瞄准最简单的工作。 – DPM

+0

你可以试试这个:http://stackoverflow.com/a/25866412/3767784 – FaNaJ

回答

6

这个正则表达式会给你一个带有可选端口的IP。如果总是有一个端口在行尾删除问号。

\d{1,3}(?:\.\d{1,3}){3}(?::\d{1,5})? 

请注意,这是一个IPv4的简化验证,只会匹配它们是一个正确的格式而不是有效的格式。并且记得添加一个额外的反斜杠来转义java中的每个反斜杠。

下面是一个例子在Java中:

String text = "46.102.241.199:3128 0.2990 Transp. NN N 100% 2011-11-19 17:56:02"; 
String pattern = "\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d{1,5})?"; 

Pattern compiledPattern = Pattern.compile(pattern); 
Matcher matcher = compiledPattern.matcher(text); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

输出:

46.102.241.199:3128 
2

我不认为你需要的正则表达式这一点,这是可能的StringTokenizer的。

import java.util.ArrayList; 
import java.util.StringTokenizer; 

public class SOScrap{ 
public static void main(String[] args) { 
    ArrayList<String> as = new ArrayList<String>(); 
    ArrayList<String> asa = new ArrayList<String>(); 
    String s = "46.102.241.199:3128 0.2990 Transp. NN N 100% 2011-11-19 17:56:02"; 
    StringTokenizer st = new StringTokenizer(s, " "); 
     while(st.hasMoreTokens()){ 
       as.add(st.nextToken()); 
     } 

    StringTokenizer astk = new StringTokenizer(as.get(0), ":"); 

     while(astk.hasMoreTokens()){ 
      asa.add(astk.nextToken()); 
     } 
    System.out.println(asa); 
} 

} 

输出

[46.102.241.199, 3128] 

您现在可以访问一个ArrayList的元素。第一个索引持有IP,而第二个持有该端口。