Java 选择包含在常用格式行中的数字

Java 选择包含在常用格式行中的数字,java,regex,Java,Regex,这是我的模式: Pattern.compile( "^(.+?)([A-Z]+?)([\\.\\s\\.]+?)(\\d+(?:\\.\\d+)?)" ); 如果我通过这条线,我会得到我想要的东西(12.0): 但是,如果我通过这一行(我不打算检索任何数字),我会得到14: GENERIC HOSPITAL, TX 14 Feb 2018@1143 作为另一个示例,此行返回30(我不想要): 理想情况下,我希望能够从

这是我的模式:

Pattern.compile( "^(.+?)([A-Z]+?)([\\.\\s\\.]+?)(\\d+(?:\\.\\d+)?)" );
如果我通过这条线,我会得到我想要的东西(
12.0
):

但是,如果我通过这一行(我不打算检索任何数字),我会得到
14

GENERIC HOSPITAL, TX                                       14 Feb 2018@1143
作为另一个示例,此行返回
30
(我不想要):

理想情况下,我希望能够从传递的
字符串中返回
labType
labValue
。对于第一个示例,我可以返回
12.0
。我会将其分配给
labValue
。我想将
WBC
分配给
labType
,但我还没有弄明白

患者实验室打印出来的
.txt
中有许多行。但我关心的所有行都有类似的格式:

它们都包含字符串
至少一次。
labType
正好位于这个重复字符串的前面(如上例中的
WBC
)。有时
STAT
或空
\\s
(空白)会出现在
labType
之前-我不希望在
labType
中包含此项。
labValue
总是紧跟在重复字符串之后(就像上面示例中的
12.0
那样)。这个数字之后的任何东西(有些有小数,有些没有小数),我都不在乎

以下是包含
labType
labValue
的行的一些附加示例:

 MCV . . . . . . . . . .  79.6     L           (80-100)       fL
 MCH . . . . . . . . . .  28.0                 (26-34)        pg
 MCHC. . . . . . . . . .  35.2                 (32-36)        g/dL
 RDW . . . . . . . . . .  18.4     H         (11.5-14.5)      %
 PLATELETS . . . . . .   539       H          (150-440)       X10(9)/L
 MPV . . . . . . . . . .   9.2     L          (9.4-12.3)      fL
 GRANULO/100 . . . . . .  69.1               (42.2-75.2)      %
 LYMPH/100 WBC . . . . .  21.1     L           (22-44)        %
 MONO/100 WBC. . . . . .   5.7                  (0-10)        %
 EOS/100 WBC . . . . . .   2.7                  (0-5)         %
 BASO/100 WBC. . . . . .   0.3                  (0-3)         %
 NEUT# . . . . . . . . .  11.16    H          (1.5-7.5)       X10(9)/L
 LYMPH#. . . . . . . . .   3.4                (1.0-4.8)       X10(9)/L
 MONO# . . . . . . . . .   0.9     H            (0-0.8)       X10(9)/L
 EOS#. . . . . . . . . .   0.44                 (0-.45)       X10(9)/L
以下是其他“干扰”行的一些示例:

我觉得我正忙着弄清楚这件事,但我刚刚开始使用雷格克斯。我走远了吗


谢谢你

你很接近。此正则表达式应提供您需要的内容:

^(?:STAT\s|\s+)(.*?)(?:\s\.|\.){2,}(?:[\s\.]*)(\d+\.\d+|\d+)

你们非常接近。此正则表达式应提供您需要的内容:

^(?:STAT\s|\s+)(.*?)(?:\s\.|\.){2,}(?:[\s\.]*)(\d+\.\d+|\d+)
试试这个正则表达式:

^\s*(?:STAT\s*)?(.*?)(?:\s*\.)+\s*(\d*(?:\.\d+)?)

说明:

  • ^
    -断言字符串的开头
  • \s*
    -匹配0多次出现的空白
  • (?:STAT\s*)?
    -匹配单词
    STAT
    ,后跟0+个空格。最后的
    使该部分成为可选部分
  • (.*)
    -匹配除换行符以外的任何字符的0+次出现次数,并尽可能少地将其捕获到组1中。组1现在包含labType
  • (?:\s*\)+
    -匹配0+次出现的空格,后跟
    。末尾的
    +
    尝试匹配此子序列1次或多次
  • \s*
    -匹配0多次出现的空白
  • (\d*(?:\。\d+)
    -匹配0+个数字,后跟可选-
    后跟1+个数字。在第2组中捕捉整场比赛。组2现在包含labValue
试试这个正则表达式:

^\s*(?:STAT\s*)?(.*?)(?:\s*\.)+\s*(\d*(?:\.\d+)?)

说明:

  • ^
    -断言字符串的开头
  • \s*
    -匹配0多次出现的空白
  • (?:STAT\s*)?
    -匹配单词
    STAT
    ,后跟0+个空格。最后的
    使该部分成为可选部分
  • (.*)
    -匹配除换行符以外的任何字符的0+次出现次数,并尽可能少地将其捕获到组1中。组1现在包含labType
  • (?:\s*\)+
    -匹配0+次出现的空格,后跟
    。末尾的
    +
    尝试匹配此子序列1次或多次
  • \s*
    -匹配0多次出现的空白
  • (\d*(?:\。\d+)
    -匹配0+个数字,后跟可选-
    后跟1+个数字。在第2组中捕捉整场比赛。组2现在包含labValue

我很难理解您想要匹配什么
labType
应该是
前面的大写字母字符串
labValue
是紧跟其后的数字吗?没有点的线应该被完全忽略?是的,这是正确的!那些以字符串开头的行呢,比如
granu/100
LYMPH/100 WBC
?哪些部分是实验室类型?
grano/100
将是实验室类型。在<代码>之前的唯一一件事这不是一个
labType
是当单词
STAT
出现的时候。我很难理解你想要匹配什么
labType
应该是
前面的大写字母字符串
labValue
是紧跟其后的数字吗?没有点的线应该被完全忽略?是的,这是正确的!那些以字符串开头的行呢,比如
granu/100
LYMPH/100 WBC
?哪些部分是实验室类型?
grano/100
将是实验室类型。在<代码>之前的唯一一件事不是
标签类型
是当单词
STAT
出现时。垂直条是方括号内的文字,而不是交替。非常感谢,这个答案有效,与下面的答案相比,输出上的差异很小。您的正则表达式在
labType
之前输出空格(例如
HGB
),而@Gurman正则表达式在
labType
之前输出
Type=HGB值=7.5
,没有空格,这是因为点。我已经更新了我的正则表达式,它现在与您提供的链接一起工作。:)。现在检查格式化的行是否在中间有至少2个点。代码>{2,}
谢谢!Regex令人难以置信。我需要好好学习。有什么建议吗?竖条是文字w
^\s*(?:STAT\s*)?(.*?)(?:\s*\.)+\s*(\d*(?:\.\d+)?)