我有一个文本文件,其中包含一个人的信息。我写了一个正则表达式来提取一个人的年龄,即X年Y个月。
String n="Mayur is 18 years 4 months old ";
Pattern p=Pattern.compile("[\\d+\\s+years]+[\\d+\\s+months]+",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(n);
while (m.find()) {
System.out.println(m.group(0));
}
我收到的输出是:
r
s 18 years 4 months o
我没有在输出中提取那些想要的字符,而是列出它们。
预期输出为:
18 years 4 Month
请注意,这些记录只有几年,有些只有几个月。
答案 0 :(得分:2)
正则表达式的问题在于[\d+\s+years]
匹配列表中找到的任何字符,这就是为什么在结果中r
不必使用括号[]
{ {1}}。
这是您需要的正则表达式(\\d+\\s* years\\s*)*(\\d+\\s* months)*
,使用()
作为匹配组。
我将\\s+
更改为\\s*
,以使其符合以下情况:
Mayur is 18years 4months old
这是 Live DEMO
修改强>:
空字符串的问题是由匹配组之后的*
量词引起的,我使用这个新的正则表达式修复了它:
(\\d+\\s* years\\s*)+|(\\d+\\s* months)+
请参阅 DEMO here
答案 1 :(得分:1)
答案 2 :(得分:1)
试试这个:
String n="Mayur is 18 years 4 months old ";
Pattern p=Pattern.compile("([0-9]+) years ([0-9]+) months",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(n);
while (m.find()) {
String years = m.group(1);
String months = m.group(2);
System.out.println(m.group(0));
}
使用" 0"作为一个群体你可以得到整个表达。否则使用1或2可以获得值。