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+)?)