带有后缀的简单键值对的Java正则表达式

时间:2013-01-28 11:17:00

标签: java regex key-value keyvaluepair

考虑一组字符串,如下所示:

Memory size = 4,194,304 KB
Cache size=   32,768 K
Number of cores = 8
Note   =4,000,000 KB is less than 4 GB

是否存在通用且不太复杂的Java正则表达式,它完全匹配每个字符串并生成以下组?

"Memory size", "4,194,304", "KB"
"Cache size", "32,768", "K"
"Number of cores", "8"
"Note", "4,000,000 KB is less than 4 GB"

这些群组是keyvalue和(可选)suffix

其他要求:

  • 值(即'='之后的部分)不一定是数字
  • ':'两侧的任何空格都应该一次性删除,不需要回溯
  • “KB”和“K”字符串匹配不区分大小写
  • 捕获的组应始终具有相同的索引(理想情况下,键/值/后缀为3组,所有匹配的组索引相同)

显然,像

这样的简单表达
  • ([^=]+) *: *([^=]+)

并未完全涵盖上述规范。

3 个答案:

答案 0 :(得分:2)

完全涵盖上述规范的正则表达式是:

^([^=]+?) *= *(.+?) *$

修改

原来我错过了K / KB部分。以下是修订版:

^([^=]+?) *= *(.+?) *(KB?)? *$

答案 1 :(得分:2)

这样的事情应该有效:

^(.*?)\s*=\s*(?:([\d,]+)\s*(K|KB)$|(.*))

^ - 匹配行的开头

(.*?)通过匹配任何内容来捕获左边的术语(?使其非贪婪;否则会占用所有空格。)

\s*=\s*匹配并丢弃等号及其周围的任何空格。

(?:([\d,]+)\s*(K|KB)$|(.*))这个长组匹配任何一个或另一个。 (?:使其成为非捕获组,因为您不想捕获整个事物。

([\d,]+)\s*(K|KB)$如果有一个数字后面只有K或KB而且字符串的结尾与两个组匹配。

(.*)否则,匹配一组中剩余的所有内容。

答案 2 :(得分:0)

尝试并告诉我它是否有效:

(.*) *= *(.*) (.*)