我正在尝试创建正则表达式。 有一个年龄,可以用多种方式写出:
e.g。对于64岁的人来说,可能是:
但是对于0岁,它也可能是
你能帮我为JAVA matcher制作正确的常规,所以我可以在解析这个年龄字符串后得到Integer。
目前我来到了以下,显然没有涵盖所有可能的情况。
@Test
public void testAgeConverter() throws AppException, IOException {
Pattern pattern = Pattern.compile("0([0-9]+|[1-9]+)[Yy]?");
Matcher m = pattern.matcher("062Y");
String str = "";
if (m.find()) {
for (int i = 1; i <= m.groupCount(); i++) {
str += "\n" + m.group(i);
}
}
System.out.println(str);
}
感谢您的帮助,谢谢。
答案 0 :(得分:2)
我会尝试使用以下自包含的示例:
String[] testCases = {
"064Y", "064", "64", "0Y", "0"
};
int[] expectedResults = {
64, 64, 64, 0, 0
};
// ┌ optional leading 0
// | ┌ 1 or 2 digits from 0 to 9 (00->99)
// | | in group 1
// | | ┌ optional one Y
// | | | ┌ case insensitive
Pattern p = Pattern.compile("0*([0-9]{1,2})Y?", Pattern.CASE_INSENSITIVE);
// fine-tune the Pattern for centenarians
// (up to 199 years in this ugly draft):
// "0*([0-1][0-9]{1,2}";
for (int i = 0; i < testCases.length; i++) {
Matcher m = p.matcher(testCases[i]);
if (m.find()) {
System.out.printf("Found: %s%n", m.group());
int result = Integer.parseInt(m.group(1));
System.out.printf("Expected result is: %d, actual result is: %d", expectedResults[i], result);
System.out.printf("... matched? %b%n", result == expectedResults[i]);
}
}
<强>输出强>
Found: 064Y
Expected result is: 64, actual result is: 64... matched? true
Found: 064
Expected result is: 64, actual result is: 64... matched? true
Found: 64
Expected result is: 64, actual result is: 64... matched? true
Found: 0Y
Expected result is: 0, actual result is: 0... matched? true
Found: 0
Expected result is: 0, actual result is: 0... matched? true
答案 1 :(得分:0)
在任何情况下,您只需要数字就可以使用
[0]*((\d)*)
请注意,要使其在Java
中有效,您必须逃避backslash
所以
[0]*((\\d)*)
然后抓住第一个匹配组。
除了前导零之外,哪个会选择所有数字。在0
或0Y
的情况下,它会选择任何内容,但您可以使用
if(result.isEmpty())
val = 0;
答案 2 :(得分:0)
您可以尝试使用类似的内容:^0*?(\d+)Y?$
。有一个工作示例here。然后,您将迭代匹配并使用正则表达式组来提取您所追求的整数值。
答案 3 :(得分:0)
为什么你的表达如此复杂?这不会......?
Pattern pattern = Pattern.compile("([0-9]+)[Yy]?");
Matcher m = pattern.matcher("062Y");
Integer age = null;
if (m.find()) {
age = Integer.valueOf(m.group(1));
}
System.out.println(age);
答案 4 :(得分:0)
你需要更正确地使用正则表达式来解决它可以解决的问题:
[0-9]+[Y|y]?
但这对你没有多大帮助,你应该尝试用这些值附近的唯一标识符来缩小范围
答案 5 :(得分:0)
如果您使用的是matcher.find
,则甚至无需匹配前导零;两者都不匹配[yY]
,因此我们有:
(1[0-9][0-9]|[1-9]?[0-9])
将找到0到199之间的所有整数并将它们分组给出