考虑一组字符串,如下所示:
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
。
其他要求:
显然,像
这样的简单表达([^=]+) *: *([^=]+)
并未完全涵盖上述规范。
答案 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)
尝试并告诉我它是否有效:
(.*) *= *(.*) (.*)