如何使用正则表达式从字符串中提取子字符串?

时间:2015-01-16 13:18:40

标签: java regex string

我想从以下字符串中提取用户名和日期:

Syed Arafath on Jan 7, 2015
Capt.KSD on Dec 30, 2014
chakradharalasakani on Dec 29, 2014
mitesh0123 on Dec 18, 2014
Aparajita61@yahoo.in on Dec 3, 2014
123chetan on Oct 28, 2014

我想要输出如下:

Syed Arafath
Capt.KSD
chakradharalasakani
mitesh0123
Aparjita61@yahoo.co.in
Jan 7,2015
Dec 30, 2014
Dec 29,2014
Dec 18,2014
Dec 3, 2014
Oct 28, 2014

总而言之,我想将字符串“Syed Arafath于2015年1月7日”拆分为2个字符串,一个包含用户名,另一个包含日期。

5 个答案:

答案 0 :(得分:4)

\\s+on\\s+上进行拆分,你应该得到你想要的东西

参见演示。

https://regex101.com/r/tX2bH4/29

编辑:

使用\\s+on\\s+(?!.*\bon\b)

https://regex101.com/r/tX2bH4/30

如果您也关心Syed on Arafath。前瞻确保在最后on上进行拆分。

答案 1 :(得分:1)

根据以下正则表达式分割您的输入,

"\\s+on\\s+(?=\\S+\\s+\\d{1,2},)"

代码:

String txt = "Syed on Arafath on Jan 7, 2015";
String[] parts = txt.split("\\s+on\\s+(?=\\S+\\s+\\d{1,2},)");
System.out.println(Arrays.toString(parts));

输出:

[Syed on Arafath, Jan 7, 2015]

答案 2 :(得分:0)

import java.util.regex.*;
Pattern p = Pattern.compile("(.*) on (.*)");
Matcher m = p.matches(input);
if( m.matches() ) {
    String username = m.group(1);
    String date = m.group(2);
} else {
    throw new Exception("Did not match expected pattern");
}

答案 3 :(得分:0)

使用直接正则表达式更适合拆分:

Matcher m = Pattern.compile("(.*) on .*").matcher(input);
m.matches();
System.out.println(m.group(1));

*量词的贪婪质量保证名称中的任何on都会被它抓取,只有最后 on的出现将与on字面值相匹配。

答案 4 :(得分:0)

作为拆分的替代方法,您可以使用replaceAll

    String name = s.replaceAll("(.*) on .*", "$1");
    String date = s.replaceAll(".*(\\w{3} \\d{1,2}, \\d{4}).*", "$1");