我是Java的新手,特别是regex 我有一个类似于:
的CSV文件col1,col2,clo3,col4
word1,date1,date2,port1,port2,....some amount of port
word2,date3,date4,
....
我想要的是迭代每一行(我想我会用简单的for循环来做)并获得所有端口。
我想我需要的是在两个日期之后获取所有东西并寻找
,(\d+),?
和回来的小组
我的问题是:
1)可以用一个表达式完成吗? (意思是,不将结果存储在字符串中,然后应用另一个正则表达式)
2)我可以将迭代结合到正则表达式中吗?
答案 0 :(得分:3)
有很多方法可以做到这一点,我将展示一些用于教育目的。
我将您的输入放在String
仅作为示例,您必须正确阅读。我还将结果存储在List
中并在最后打印出来:
public static void main(String[] args) {
String source = "col1,col2,clo3,col4" + System.lineSeparator() +
"word1,date1,date2,port1,port2,port3" + System.lineSeparator() +
"word2,date3,date4";
List<String> ports = new ArrayList<>();
// insert code blocks bellow
System.out.println(ports);
}
使用Scanner
:
Scanner scanner = new Scanner(source);
scanner.useDelimiter("\\s|,");
while (scanner.hasNext()) {
String token = scanner.next();
if (token.startsWith("port"))
ports.add(token);
}
使用String.split
:
String[] values = source.split("\\s|,");
for (String value : values) {
if (value.startsWith("port"))
ports.add(value);
}
使用Pattern
- Matcher
:
Matcher matcher = Pattern.compile("(port\\d+)").matcher(source);
while (matcher.find()) {
ports.add(matcher.group());
}
输出:
[port1, port2, port3]
如果你知道&#34; ports&#34;如果位于文件中,您可以使用该信息通过指定位置和获取子字符串来略微提高性能。
答案 1 :(得分:2)
是的,它可以在一行中完成:
这是神奇的界限:
PD.orgs.FirstOrDefault(o => o.orgname == selectedOrgName)
正则表达式说“任何具有非数字的术语”,其中“术语”是输入开始/逗号和逗号/输入结束之间的一系列字符。
方便地,String[] ports = line.replaceAll("(^|(?<=,))[^,]*[^,\\d][^,]*(,|$)", "").split(",");
方法不会返回尾随空白术语,因此无需担心第一次替换后留下的任何尾随逗号。
在java 8中,你可以在一行中完成它,但事情要简单得多:
split()
这会对逗号分割的结果进行流式处理,然后过滤掉非全数字元素,它们会收集结果。
一些测试代码:
List<String> ports = Arrays.stream(line.split(",")).filter(s -> s.matches("\\d+")).collect(Collectors.toList());
输出:
String line = "foo,12-12-12,11111,2222,bar,3333";
String[] ports = line.replaceAll("(^|(?<=,))[^,]*[^,\\d][^,]*(,|$)", "").split(",");
System.out.println(Arrays.toString(ports));
java 8中的相同输出:
[11111, 2222, 3333]