正常表达为dicom年龄

时间:2015-02-09 16:38:01

标签: java regex

我正在尝试创建正则表达式。 有一个年龄,可以用多种方式写出:

e.g。对于64岁的人来说,可能是:

  • 064Y
  • 064
  • 64

但是对于0岁,它也可能是

  • 0Y
  • 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);

  }

感谢您的帮助,谢谢。

6 个答案:

答案 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)*)

然后抓住第一个匹配组。

除了前导零之外,哪个会选择所有数字。在00Y的情况下,它会选择任何内容,但您可以使用

轻松查看
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之间的所有整数并将它们分组给出