这是我的模式:
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
返回labValue
和String
。对于第一个示例,我可以返回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
以下是其他“干扰者”行的一些例子:
PLASMA
Performing Lab: GENERIC LAB
111111 ABC 222
Order comment: ONETIME
我觉得我正处于解决这个问题的尖端,但我刚开始使用正则表达式。我离开了吗?
谢谢
答案 0 :(得分:1)
答案 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