选择通常格式化的行

时间:2018-02-15 00:33:22

标签: java regex

这是我的模式:

Pattern.compile( "^(.+?)([A-Z]+?)([\\.\\s\\.]+?)(\\d+(?:\\.\\d+)?)" );

如果我通过这一行,我会得到我想要的东西(12.0):

STAT WBC . . . . . . . . . .  12.0     H          (3.5-11.0)      X10(9)/L

但是,如果我通过这一行(我打算不检索任何号码),我会14

GENERIC HOSPITAL, TX                                       14 Feb 2018@1143

作为另一个例子,这一行返回30(我不想要):

NAME, FAKE                   30/50  SSN: 123456789     Rec #: 123456

理想情况下,我希望能够从通过的labType返回labValueString。对于第一个示例,我可以返回12.0。我会将此分配给labValue。我想将WBC分配给labType,但我还没想出来。

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

. . . . .

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

以下是包含labTypelabValue的行的其他一些示例:

 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

以下是其他“干扰者”行的一些例子:

PLASMA
Performing Lab: GENERIC LAB
111111 ABC 222              
Order comment:  ONETIME

我觉得我正处于解决这个问题的尖端,但我刚开始使用正则表达式。我离开了吗?

谢谢

2 个答案:

答案 0 :(得分:1)

你非常接近。这个正则表达式应该提供你需要的东西:

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

Demo

答案 1 :(得分:1)

试试这个正则表达式:

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

<强> Click for Demo

<强> See the JAVA output here

<强>解释

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