我有以下文字
My thing 0.02
My thing 100.2
My thing 65
My thing
0.03
My thing
13
My thing
45.67 stuff
我想提取“我的东西”。并且与它相关联的数字可以将它拆分并放入地图中(我知道在这个例子中键会相互过度 - 这只是我在这里使用的例子 - 我的东西实际上会被合并到它自己的地图中所以它不是问题)
Mything=0.02,Mything=100.2,Mything=65,Mything=0.03,Mything=13,Mything=45.67
我试过
Pattern match_pattern = Pattern.compile(start.trim()+"\\n.*?\\d*\\.\\d*\\s",Pattern.DOTALL);
但这并不是我想做的事情
答案 0 :(得分:1)
整数或小数的模式可能是compiled query
,所以如果你想查找\d+(\.\d+)?
后跟那个数字和两者之间的可选空格,你可以尝试模式start
(行中断也是空格)并将模式应用于多行文本(即不要将其应用于单独的行)。如果两者之间可以存在任何内容(不仅仅是空格),那么您希望将start + "\\s*\\d+(\\.\\d+)?"
与DOT_ALL标志一起使用,而不是.*
。
表达式\s*
start + "\\s*\\d+(\\.\\d+)?"
包含从其他地方提供的子表达式。如果你想确保它被视为文字(即start
之类的特殊字符,则不会被解释为用*
和\Q
包裹,即\E
)< / LI>
"\\Q" + start + "\\E"
(或Java字符串文字中的\s*
表示&#34;任何空格&#34;其中还包括换行符\\s*
(或Java字符串文字中的\d+(\.\d+)?
表示&#34;一个或多个数字后跟零或一个由点组成的组和一个或多个数字&#34; - 这意味着&#34;点和一个或多个数字&#34; part是可选的,但如果有一个点,则必须后跟至少一个数字。附加说明:如果您想访问捕获组,例如提取您想要为可选部分使用非捕获组的数字,并将整个(子)表达式包装在捕获组中,例如, \\d+(\\.\\d+)?
。在这种情况下,如果您使用(\d+(?:\.\d+)?)
和Pattern
,则可以使用Matcher
访问该号码 - 或者如果您将group(1)
包裹在一个组中(与start
类似,您可以将第一部分设为"(\\Q" + start + "\\E)\\s*(\\d+(?:\\.\\d+)?)"
,将第二部分设为group(1)
。
答案 1 :(得分:1)
如果您只想提取记录,可以像
那样进行 String s = "My thing 0.02\nMy thing 100.2\nMy thing 65\nMy thing\n"+
"0.03\nMy thing\n13\nMy thing\n 45.67 stuff\n";
Matcher m = Pattern.compile("(My thing)\\s*(\\d+(?:\\.\\d+)?)").matcher(s);
然后遍历匹配并添加到字典,或者什么......;)
while (m.find()) {
// Add to dictionary, group 1 is key, 2 is value
System.out.println("Found: " + m.group(0)+ ":" + m.group(1)+":" + m.group(2));
}