1

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

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"

这些组是key,value和 (可选) suffix

其他要求:

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

显然,一个简单的表达式

  • ([^=]+) *: *([^=]+)

不完全涵盖上述规范。

4

3 回答 3

2

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

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

编辑

原来我错过了 K/KB 部分。这是修改后的版本:

^([^=]+?) *= *(.+?) *(KB?)? *$
于 2013-01-28T11:30:38.373 回答
2

像这样的东西应该工作:

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

^- 匹配行首

(.*?)通过匹配任何东西来捕获左项(?使其不贪婪;否则它会吃掉所有的空白)。

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

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

([\d,]+)\s*(K|KB)$ 如果有一个数字后跟 K 或 KB 和字符串的结尾,则在两组中匹配。

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

于 2013-01-28T11:34:10.237 回答
0

试试看,告诉我它是否有效:

(.*) *= *(.*) (.*)
于 2013-01-28T11:31:12.677 回答