带后缀的简单键值对的Java正则表达式
考虑一组字符串,如下所示:带后缀的简单键值对的Java正则表达式,java,regex,key-value,keyvaluepair,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" "
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"
这些组是键
、值
和(可选)后缀
其他要求:
- 该值(即“=”之后的部分)不一定是数字
- “:”两侧的任何空格都应在一次过程中删除,不得回溯
- “KB”和“K”字符串匹配不区分大小写
- 捕获的组应始终具有相同的索引(理想情况下,键/值/后缀为3个组,所有匹配项都具有相同的组索引)
([^=]+)*:*([^=]+)
未完全涵盖上述规范。完全涵盖上述规范的正则表达式是:
^([^=]+?) *= *(.+?) *$
编辑
结果我错过了K/KB部分。以下是修订版本:
^([^=]+?) *= *(.+?) *(KB?)? *$
完全涵盖上述规范的正则表达式是:
^([^=]+?) *= *(.+?) *$
编辑
结果我错过了K/KB部分。以下是修订版本:
^([^=]+?) *= *(.+?) *(KB?)? *$
试试看,告诉我它是否有效:
(.*) *= *(.*) (.*)
试试看,告诉我它是否有效:
(.*) *= *(.*) (.*)
像这样的方法应该会奏效:
^(.*?)\s*=\s*(?:([\d,]+)\s*(K|KB)$|(.*))
^
-匹配行首
(.*?
通过匹配任何内容来捕获左边的术语(?
使其不贪婪;否则它将吃掉所有空白)
\s*=\s*
匹配并丢弃等号及其周围的任何空格
(?:([\d,]+)\s*(K | KB)$|(.*)
这个长组匹配一个或另一个<代码>(?:使其成为非捕获组,因为您不想捕获整个内容
([\d,]+)\s*(K | KB)$
如果有一个数字后跟K或KB以及字符串的结尾,请将其分为两组进行匹配
(.*)
否则,匹配一个组中剩余的所有内容。类似的操作应该可以:
^(.*?)\s*=\s*(?:([\d,]+)\s*(K|KB)$|(.*))
^
-匹配行首
(.*?
通过匹配任何内容来捕获左边的术语(?
使其不贪婪;否则它将吃掉所有空白)
\s*=\s*
匹配并丢弃等号及其周围的任何空格
(?:([\d,]+)\s*(K | KB)$|(.*)
此长组匹配一个对象或另一个对象。(?:
使其成为非捕获组,因为您不想捕获整个对象
([\d,]+)\s*(K | KB)$
如果有一个数字后跟K或KB以及字符串的结尾,请将其分为两组进行匹配
(.*)
否则,匹配一个组中剩余的所有内容。不匹配,但需要+1帮助。这不接近。(.*))
总是会消耗掉所有的空白,因此您的“*”永远不会匹配任何内容。在等号之后,您将单个字符与一个组匹配,然后将其他所有字符与第二个组匹配。编辑的版本更好,但仍然不起作用(例如,它捕获了“GB”在第四个字符串中作为一个单独的答案。您可以在测试它并验证它。它没有,但是+1用于帮助。这不接近。(*)
总是会消耗掉所有的空白,因此您的“*”永远不会匹配任何内容。在等号之后,您将单个字符与一个组匹配,然后将其他所有字符与第二个组匹配。编辑的版本更好,但仍然不起作用(例如,它捕获了“GB”在第四个字符串中作为一个单独的答案。您可以在进行测试并验证。这匹配所有字符串,但不会为“KB”或“K”生成单独的组。@PNS Oops…我已修改了响应。现在它应该像requestedIt一样工作,实际上它只在3个组中捕获答案,始终使用相同的索引。很好!:-)至于大小写不敏感,您还可以编写:^([^=]+?)*=*(.+?)*([Kk][Bb]?)*$
要使模式不区分大小写,您可以使用compile方法和模式。不区分大小写的
标志类似于模式。compile(“regex”,pattern.case不区分大小写);
,或者只使用(i)
类似于(^[^=+])*(.+?)*(KB?)*$
。这会匹配所有字符串,但不会为“KB”或“K”生成单独的组。+1作为帮助。@PNS Oops…我已经修改了响应。现在它应该像requestedIt一样工作,实际上它只在3个组中捕获答案,始终使用相同的索引。很好!:-)至于大小写不敏感,您还可以编写:^([^=]+?)*=*(.+?)*([Kk][Bb]?)*$
要使模式不区分大小写,您可以使用compile方法和模式。不区分大小写的
标志类似于模式。compile(“regex”,pattern.case不区分大小写);
,或者只使用(i)
类似于(^[^=+])*(.+?)*(KB?)*$
。这是可行的,但它不会始终捕获同一组索引中的“值”。它生成4个组而不是3个组,字符串3和4的答案位于组4而不是组2。这是可行的,但它不会捕获“值”始终在同一组索引中。它生成4组而不是3组,字符串3和4的答案在组4而不是组2中。