我有一个源字符串,我想将data
分开:
String source = "data|junk,data|junk|junk,data,data|junk";
String[] result = source.split(",");
上面给出了data|junk, data|junk|junk, data, data|junk
。为了进一步获取数据,我这样做了:
for (int i = 0; i < result.length; i++) {
result[i] = result[i].split("\\|")[0];
}
这给了我想要的data, data, data, data
。我想看看是否可以使用正确的正则表达式进行一次拆分:
String[] result = source.split("\\|.*?,");
上面给出了data, data, data,data|junk
,其中最后两个数据没有被拆分。你能帮忙用正确的正则表达式得到我想要的结果吗?
示例字符串:“Ann | xcjiajeaw,Bob | aijife | vdsjisdjfe,Clara,David | rijfidjf”
预期结果:“Ann,Bob,Clara,David”
答案 0 :(得分:3)
您可以更改正则表达式以考虑“垃圾”,然后在匹配数据时保持匹配:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexTest {
public static void main(String[] args) {
String input = "Ann|xcjiajeaw,Bob|aijife|vdsjisdjfe,Clara,David|rijfidjf";
Pattern p = Pattern.compile("(\\w+)(\\|\\w+)*,?");
Matcher m = p.matcher(input);
while (m.find()) {
System.out.println(m.group(1));
}
}
}
正则表达式查找单词字符(字母,数字和下划线)并捕获它。然后它再次查找管道符号(转义为正则表达式中没有特殊含义),再次使用单词字符。此管道加字词可以发生任意数量(零到多次)。之后可以是逗号,可选。
打印
安
鲍勃
克拉拉
大卫
它还会捕获“垃圾”,您可以在循环中使用m.group(2)
访问它。如果您不想捕获它,请在正则表达式中插入?:
:
Pattern.compile("(\\w+)(?:\\|\\w+)*,?");
答案 1 :(得分:2)
在字符串中,
安| xcjiajeaw,鲍勃| aijife | vdsjisdjfe,克拉拉,大卫| rijfidjf
\\|.*?,
- 这将匹配|anynoncommastring,
但这与最终的|rijfidjf
不匹配,因为它不以逗号结尾。为了与之匹配,请使用(,|$)
而不是,
,制作正则表达式\\|.*?(,|$)
但上述内容与单个孤立的逗号不匹配,因此,
与\\|.*?(,|$)
交替显示最终正则表达式(\\|.*?(,|$)|,)
。
模式(\\|.*?(,|$)|,)
有效,
String source = "Ann|xcjiajeaw,Bob|aijife|vdsjisdjfe,Clara,David|rijfidjf";
String[] result = source.split("(\\|.*?(,|$)|,)");
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
输出:
Ann
Bob
Clara
David
答案 2 :(得分:1)
我提出了以下解决方案:
String source = "one|junk,two|junk|junk,three,four|junk|junk";
String[] result = source.split("([|](?:(.*?,(?=[^,]+[|,]|$))|.*$))|,");
System.out.println(Arrays.toString(result));
[one, two, three, four]