Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带后缀的简单键值对的Java正则表达式_Java_Regex_Key Value_Keyvaluepair - Fatal编程技术网

带后缀的简单键值对的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中。