java正则表达式中,如何匹配特定两个字符串直接的数据,同时合并两个表达式

guyi5 2016-02-26 10:57:58
数据如下:
(1)2016-02-19 14:41:46,649 INFO process 7: 37002, #1.csv, EthPort(PLAT)_20160219144638716
(2)2016-02-19 14:41:50,090 INFO process 7: finish post-process file: CELL(PLAT)_20160219144638719+0800

需要得到的数据是:
(1)#1.csv,和_20160219144638716之间的那个字符串 EthPort(PLAT)
(2)process 7: finish post-process file:和_20160219144638719+0800之间的那个字符串CELL(PLAT)

问题说明:
(1)如何获取特定的两个字符串直接的数据
(2)上面需要得到的那两个数据是同一种类型,所以需要将两个表达式放在一起,相当于或

这个问题我查了一些资料,目前还是没有解决,请大神帮忙看看,谢谢了!
...全文
747 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2016-02-28
  • 打赏
  • 举报
回复
引用 22 楼 rickylin86 的回复:
把正则的内容放在一个CDATA中就没问题了.然后XML解释器解释的时候直接读取.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE regex [
	<!ELEMENT regex (code)>
	<!ELEMENT code (#PCDATA)>
]>

<regex>
	<code>
		<![CDATA[
			(?s)(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3
		]]>
	</code>
</regex>

可以
rickylin86 2016-02-28
  • 打赏
  • 举报
回复
下面的这个代码可以实现.不过会有一定的局限性的.最好测试下你所有的log信息.



import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import static java.nio.file.StandardOpenOption.*;
//JDK 1.7以上支持.

/*
---------- java ----------
ikt4mvbb-2
ikm5iwa6-2

Output completed (0 sec consumed) - Normal Termination
*/

public class Test{
	public static void main(String[] args){
		String content = loadLog("work.log");
		String regex = "(?s)(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?([_#])(?<value>[^_#]+)\\7sdrmgr[.]NodeMe";
		Matcher matcher = Pattern.compile(regex).matcher(content);
		while(matcher.find()){//这里采用find
			System.out.println(matcher.group("value"));
		}
	}

	private static String loadLog(String srcPath){
		//从对应的文件路径中读取log信息.(可包含多条记录)
		Path src = Paths.get(srcPath);
		String content = null;
		try(FileChannel channel = (FileChannel)(Files.newByteChannel(src,READ));){
			int size = (int)channel.size();
			ByteBuffer buf = ByteBuffer.allocate(size);
			channel.read(buf);
			buf.flip();
			Charset charset = Charset.defaultCharset();
			CharsetDecoder decoder = charset.newDecoder();
			content = decoder.decode(buf).toString();
		}catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}

		return content;
	}
}

/* work.log 信息:
2016-02-19 14:44:09,668 INFO  [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK


2016-02-19 14:41:50,090 INFO  [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty.
*/


「已注销」 2016-02-28
  • 打赏
  • 举报
回复
引用 22 楼 rickylin86 的回复:
把正则的内容放在一个CDATA中就没问题了.然后XML解释器解释的时候直接读取.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE regex [
	<!ELEMENT regex (code)>
	<!ELEMENT code (#PCDATA)>
]>

<regex>
	<code>
		<![CDATA[
			(?s)(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3
		]]>
	</code>
</regex>

2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 大哥,你好,我又遇到一个难题,麻烦你再帮我看看 我还想提取出一个字段,类似这样的:ikt4mvbb-2 ikm5iwa6-2 (1)ikt4mvbb-2:之前就是这个格式20160219144409#,之后是# (2)ikm5iwa6-2:之前是_CSV_这种格式,之后是_ 共同点,这个需要提前的这个字符串位数不变,格式不变都是:{8位字符}-{1个数字},你看看能不能帮我看看!
家里敷泥呀 2016-02-27
  • 打赏
  • 举报
回复
写正则表达式,最好的思路去观察目标数据的共通点。 例如,目标数据都是:“ xxx(PLAT)_” 结构。 都是 [空格][一个单词](PLAT)_ 结构。 所以,你就可以这么写: .+ (\w+\(PLAT\))_.+ 取出$1即可。 如果,括号里面的值是动态的,那括号是共通的,下划线也是共通的,这些都是参考依据。 顺便说一下,你的 | 没起作用的问题。 解析器不知道你的 | 得作用范围,所以改成: (?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12}) 试试。PS:该语句没测试,只是居于你的例子改的,有错误自行修正。
「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 2楼godblessHugh 的回复:
正则表达式没有问题,应该是Java语句本身写的有问题。 不过如果你说的是上面两个字符串是连在一起做匹配的话,也就是: (1)2016-02-19 14:41:46,649 INFO process 7: 37002, #1.csv, EthPort(PLAT)_20160219144638716(2)2016-02-19 14:41:50,090 INFO process 7: finish post-process file: CELL(PLAT)_20160219144638719+0800 这种格式,没有换行,那应该用正则里面的最短匹配,加个问号: finish post-process file: (.*?)_\d{12}|csv, (.*?)_\d{12}
是两行啊 那两个表达式都是可以分别匹配 但是放一起就不行了
rickylin86 2016-02-27
  • 打赏
  • 举报
回复
把正则的内容放在一个CDATA中就没问题了.然后XML解释器解释的时候直接读取.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE regex [
	<!ELEMENT regex (code)>
	<!ELEMENT code (#PCDATA)>
]>

<regex>
	<code>
		<![CDATA[
			(?s)(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3
		]]>
	</code>
</regex>

「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 19 楼 rickylin86 的回复:
看看上面的代码是否符合你的要求.

你看看我xml的报错提示:
「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 8 楼 Q80470101 的回复:
[quote=引用 7 楼 guyi5 的回复:] [quote=引用 5 楼 Q80470101 的回复:] 写正则表达式,最好的思路去观察目标数据的共通点。 例如,目标数据都是:“ xxx(PLAT)_” 结构。 都是 [空格][一个单词](PLAT)_ 结构。 所以,你就可以这么写: .+ (\w+\(PLAT\))_.+ 取出$1即可。 如果,括号里面的值是动态的,那括号是共通的,下划线也是共通的,这些都是参考依据。 顺便说一下,你的 | 没起作用的问题。 解析器不知道你的 | 得作用范围,所以改成: (?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12}) 试试。PS:该语句没测试,只是居于你的例子改的,有错误自行修正。
我试过这个,不行,不知为何; 另外,目标数据没有共同点,只是目标数据的前后是规律的,就是我给的数据源的那种格式,前后都一样[/quote] 把你做的尝试,以及结果都贴出来。 有更多的信息别人才知道哪出了问题。[/quote] 只匹配了finish post-process file: 后面的那个 而csv, 之后那个没有匹配到 那个两个表达式,谁放前面就匹配谁,也就是 | 没有生效
引用 19 楼 rickylin86 的回复:
看看上面的代码是否符合你的要求.
谢谢你,幸苦了,你写的那个正则表达式是没有问题的 问题是你写的表达式里有标签,如:<year> 、<value>等,当我把这些放入<measure_po> </measure_po>这个标签中的时候,就会报<year> 、<value>等这些没有结束标签。xml检查到数据不合法,提示如下: Multiple annotations found at this line: - End tag of element <measure_po> - The element type "value" must be terminated by the matching end-tag "</ value>" 因为我是要把表达式放到xml的标签中来读取的,所以问题就是在这,谢谢!
rickylin86 2016-02-27
  • 打赏
  • 举报
回复

import java.util.regex.Matcher;
import java.util.regex.Pattern;
//JDK 1.7以上支持.

public class Test{
	public static void main(String[] args){
		//String content = "2016-02-19 14:41:46,649 INFO  process 7: 37002, #1.csv, EthPort(PLAT)_20160219144638716";
		String content = "2016-02-19 14:41:50,090 INFO  process 7: finish post-process file: CELL(PLAT)_20160219144638719+0800";
		String regex = "^(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3.*$";
		Matcher matcher = Pattern.compile(regex).matcher(content);
		if(matcher.matches()){
			content = matcher.group("value");
		}
		System.out.println(content);
	}
}
rickylin86 2016-02-27
  • 打赏
  • 举报
回复
看看上面的代码是否符合你的要求.
rickylin86 2016-02-27
  • 打赏
  • 举报
回复


import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import static java.nio.file.StandardOpenOption.*;
//JDK 1.7以上支持.

public class Test{
	public static void main(String[] args){
		String content = loadLog("work.log");
		String regex = "(?s)(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3";
		Matcher matcher = Pattern.compile(regex).matcher(content);
		while(matcher.find()){//这里采用find
			System.out.println(matcher.group("value"));
		}
	}

	private static String loadLog(String srcPath){
		//从对应的文件路径中读取log信息.(可包含多条记录)
		Path src = Paths.get(srcPath);
		String content = null;
		try(FileChannel channel = (FileChannel)(Files.newByteChannel(src,READ));){
			int size = (int)channel.size();
			ByteBuffer buf = ByteBuffer.allocate(size);
			channel.read(buf);
			buf.flip();
			Charset charset = Charset.defaultCharset();
			CharsetDecoder decoder = charset.newDecoder();
			content = decoder.decode(buf).toString();
		}catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}

		return content;
	}
}

/* work.log 信息:
2016-02-19 14:44:09,668 INFO  [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK


2016-02-19 14:41:50,090 INFO  [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty.
*/

godblessHugh 2016-02-27
  • 打赏
  • 举报
回复
正则表达式没有问题,应该是Java语句本身写的有问题。 不过如果你说的是上面两个字符串是连在一起做匹配的话,也就是: (1)2016-02-19 14:41:46,649 INFO process 7: 37002, #1.csv, EthPort(PLAT)_20160219144638716(2)2016-02-19 14:41:50,090 INFO process 7: finish post-process file: CELL(PLAT)_20160219144638719+0800 这种格式,没有换行,那应该用正则里面的最短匹配,加个问号: finish post-process file: (.*?)_\d{12}|csv, (.*?)_\d{12}
「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 14 楼 rickylin86 的回复:
恩恩。刚大概看了下你发上来log信息源. XML中存储的表达式每个独立工作,然后获取对应的值是吧? 上面的信息源是代表两条记录是吧?或者你把信息值中对应的内容表红色出来.等下我把对应的五条正则表达式给你.
2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 数据源中标红的两个字符串就是我需要得到的:IPPath(PLAT) Cell(LTE) 另外,这个两个字符串不是固定的,只是它的位置就是这两种情况
「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 14 楼 rickylin86 的回复:
恩恩。刚大概看了下你发上来log信息源. XML中存储的表达式每个独立工作,然后获取对应的值是吧? 上面的信息源是代表两条记录是吧?或者你把信息值中对应的内容表红色出来.等下我把对应的五条正则表达式给你.
对的,上面两条数据源就是日志中的两种情况 然后我希望通过一条正则表达式来匹配这两种情况 同时,这个表达式要放到xml中的<measure_po> </measure_po>这个标签中
「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 13 楼 guyi5 的回复:
[quote=引用 12 楼 rickylin86 的回复:] [quote=引用 11 楼 guyi5 的回复:] [quote=引用 9 楼 rickylin86 的回复:] 正则都是匹配规则来获取内容的.最好你把希望得到结果内容可能出现的结构罗列出来.
2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 上面这个是我的源数据: 我希望得到类似_20160219144638719之前的那个字符串,如IPPath(PLAT)、Cell(LTE) 这两个字符串之前的内容只有两种格式: (1).csv, (2) process 7: finish post-process file: 然后我的正则表达式是要放到一个xml文件中,通过读取xml配置来获取这个表达式,xml如下: <pm_deal_step step="process 7"> <neid>#\d{14}#(.{10})|CSV_(.{10})</neid> <measure_start_time>([^A]+)\+0800-</measure_start_time> <measure_stop_time>([^-]+)\+0800_</measure_stop_time> <measure_po>(?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12})</measure_po> <log_time>(.*) INFO</log_time> </pm_deal_step>[/quote] 你的意思是你希望把正则表达式截成几段,然后后面用XML解释器来拼接得到一个完整的正则表达式的意思吗?[/quote] 我希望那个表达式就放在这个标签中:<measure_po>正则表达式</measure_po>[/quote]
引用 13 楼 guyi5 的回复:
[quote=引用 12 楼 rickylin86 的回复:] [quote=引用 11 楼 guyi5 的回复:] [quote=引用 9 楼 rickylin86 的回复:] 正则都是匹配规则来获取内容的.最好你把希望得到结果内容可能出现的结构罗列出来.
2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 上面这个是我的源数据: 我希望得到类似_20160219144638719之前的那个字符串,如IPPath(PLAT)、Cell(LTE) 这两个字符串之前的内容只有两种格式: (1).csv, (2) process 7: finish post-process file: 然后我的正则表达式是要放到一个xml文件中,通过读取xml配置来获取这个表达式,xml如下: <pm_deal_step step="process 7"> <neid>#\d{14}#(.{10})|CSV_(.{10})</neid> <measure_start_time>([^A]+)\+0800-</measure_start_time> <measure_stop_time>([^-]+)\+0800_</measure_stop_time> <measure_po>(?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12})</measure_po> <log_time>(.*) INFO</log_time> </pm_deal_step>[/quote] 你的意思是你希望把正则表达式截成几段,然后后面用XML解释器来拼接得到一个完整的正则表达式的意思吗?[/quote] 我希望那个表达式就放在这个标签中:<measure_po>正则表达式</measure_po>[/quote] 对的,上面两条数据源就是日志中的两种情况 然后我希望通过一条正则表达式来匹配这两种情况 同时,这个表达式要放到xml中的<measure_po> </measure_po>这个标签中
rickylin86 2016-02-27
  • 打赏
  • 举报
回复
恩恩。刚大概看了下你发上来log信息源. XML中存储的表达式每个独立工作,然后获取对应的值是吧? 上面的信息源是代表两条记录是吧?或者你把信息值中对应的内容表红色出来.等下我把对应的五条正则表达式给你.
「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 12 楼 rickylin86 的回复:
[quote=引用 11 楼 guyi5 的回复:] [quote=引用 9 楼 rickylin86 的回复:] 正则都是匹配规则来获取内容的.最好你把希望得到结果内容可能出现的结构罗列出来.
2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 上面这个是我的源数据: 我希望得到类似_20160219144638719之前的那个字符串,如IPPath(PLAT)、Cell(LTE) 这两个字符串之前的内容只有两种格式: (1).csv, (2) process 7: finish post-process file: 然后我的正则表达式是要放到一个xml文件中,通过读取xml配置来获取这个表达式,xml如下: <pm_deal_step step="process 7"> <neid>#\d{14}#(.{10})|CSV_(.{10})</neid> <measure_start_time>([^A]+)\+0800-</measure_start_time> <measure_stop_time>([^-]+)\+0800_</measure_stop_time> <measure_po>(?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12})</measure_po> <log_time>(.*) INFO</log_time> </pm_deal_step>[/quote] 你的意思是你希望把正则表达式截成几段,然后后面用XML解释器来拼接得到一个完整的正则表达式的意思吗?[/quote] 我希望那个表达式就放在这个标签中:<measure_po>正则表达式</measure_po>
rickylin86 2016-02-27
  • 打赏
  • 举报
回复
引用 11 楼 guyi5 的回复:
[quote=引用 9 楼 rickylin86 的回复:] 正则都是匹配规则来获取内容的.最好你把希望得到结果内容可能出现的结构罗列出来.
2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 上面这个是我的源数据: 我希望得到类似_20160219144638719之前的那个字符串,如IPPath(PLAT)、Cell(LTE) 这两个字符串之前的内容只有两种格式: (1).csv, (2) process 7: finish post-process file: 然后我的正则表达式是要放到一个xml文件中,通过读取xml配置来获取这个表达式,xml如下: <pm_deal_step step="process 7"> <neid>#\d{14}#(.{10})|CSV_(.{10})</neid> <measure_start_time>([^A]+)\+0800-</measure_start_time> <measure_stop_time>([^-]+)\+0800_</measure_stop_time> <measure_po>(?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12})</measure_po> <log_time>(.*) INFO</log_time> </pm_deal_step>[/quote] 你的意思是你希望把正则表达式截成几段,然后后面用XML解释器来拼接得到一个完整的正则表达式的意思吗?
rickylin86 2016-02-27
  • 打赏
  • 举报
回复
引用 6 楼 guyi5 的回复:
[quote=引用 3 楼 rickylin86 的回复:]

import java.util.regex.Matcher;
import java.util.regex.Pattern;
//JDK 1.7以上支持.

public class Test{
	public static void main(String[] args){
		//String content = "2016-02-19 14:41:46,649 INFO  process 7: 37002, #1.csv, EthPort(PLAT)_20160219144638716";
		String content = "2016-02-19 14:41:50,090 INFO  process 7: finish post-process file: CELL(PLAT)_20160219144638719+0800";
		String regex = "^(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3.*$";
		Matcher matcher = Pattern.compile(regex).matcher(content);
		if(matcher.matches()){
			content = matcher.group("value");
		}
		System.out.println(content);
	}
}
感谢你的帮忙,你写的这个可行的,另外我这个表达式需要放到xml中,如: <measure_po>(?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12})</measure_po> 你写的这个表达式:^(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\1\\2\\3.*$加入xml中报错如下: Multiple annotations found at this line: - End tag of element <measure_po> - The element type "value" must be terminated by the matching end-tag "</ value>". 不能加入xml中如何解决呢?请帮忙看看,谢谢![/quote]


import java.util.regex.Matcher;
import java.util.regex.Pattern;
//JDK 1.7以上支持.

public class Test{
	public static void main(String[] args){
		//以下是模拟XML中获取标签值中指定内容.(注:标签中未实现可含参数,如果需要包含参数需要重新修改)
		String content = "<src>2016-02-19 14:41:46,649 INFO  process 7: 37002, #1.csv, EthPort(PLAT)_20160219144638716</src>";
		//String content = "<content >2016-02-19 14:41:50,090 INFO  process 7: finish post-process file: CELL(PLAT)_20160219144638719+0800</content>";
		String regex = "^\\s*<(?<tagName>[^>]+)\\s*>(?<year>\\d+)-(?<month>\\d+)-(?<date>\\d+) (?<hour>\\d+):(?<minute>\\d+):(?<second>\\d+).*?(?<value>\\S+)_\\2\\3\\4.*</\\1\\s*>\\s*$";
		Matcher matcher = Pattern.compile(regex).matcher(content);
		if(matcher.matches()){
			content = matcher.group("value");
		}
		System.out.println(content);
	}
}

「已注销」 2016-02-27
  • 打赏
  • 举报
回复
引用 9 楼 rickylin86 的回复:
正则都是匹配规则来获取内容的.最好你把希望得到结果内容可能出现的结构罗列出来.
2016-02-19 14:44:09,668 INFO [PoProcessor_PROC_L_CELL_CDMA_HO37332] process 7: 37332, 201602190200+0800#20160219144409#ikt4mvbb-2#sdrmgr.NodeMe#37332#PROC_L_CELL_CDMA_HO#1.csv, Cell(LTE)_20160219021528967+080024B20160219.0200+0800-20160219.0215+0800_0_1_780-3143_180_0_ltefdd.zip, 31K. result: OK 2016-02-19 14:41:50,090 INFO [com.zte.ums.minos.slave.pm.emf.datacollect.fileparser.RptFileProcessor_CSV_ikm5iwa6-2_sdrmgr.NodeMe_sdrmgr.PlatIPPD] process 7: finish post-process file: IPPath(PLAT)_20160219144638719+080024A20160219.1430+0800-20160219.1445+0800_0_2_1000-3_0_0.zip, result: empty. 上面这个是我的源数据: 我希望得到类似_20160219144638719之前的那个字符串,如IPPath(PLAT)、Cell(LTE) 这两个字符串之前的内容只有两种格式: (1).csv, (2) process 7: finish post-process file: 然后我的正则表达式是要放到一个xml文件中,通过读取xml配置来获取这个表达式,xml如下: <pm_deal_step step="process 7"> <neid>#\d{14}#(.{10})|CSV_(.{10})</neid> <measure_start_time>([^A]+)\+0800-</measure_start_time> <measure_stop_time>([^-]+)\+0800_</measure_stop_time> <measure_po>(?:finish post-process file: (.*?)_\d{12})|(?:csv, (.*?)_\d{12})</measure_po> <log_time>(.*) INFO</log_time> </pm_deal_step>
加载更多回复(5)
课程目标:学习Java语言字符串相关的知识、字符编码常识和正则表达式的使用,并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为四部分:一、String、StringBuffer和StringBuilder类基本常识、基本原理和使用技巧二、字符编码常识三、Java语言正则表达式的详细语法和使用技巧四、实战案例课程说明:在开发Java程序的过程,最常用的类莫过于字符串相关的类。可以毫不夸张的说,任何一个Java程序,都离不开对字符串保存和处理。很多学员对字符串的理解只是处于比较粗浅的阶段。殊不知,如果对字符串处理的不好,会影响到软件的运行效率。本课程专门讲解字符串相关的知识,将从字符串的存储方式、底层的运行方式等各方面深入讲解其的原理和技巧。此外,对字符串进行更高级的处理,又要用到正则表达式的相关知识。正则表达式广泛应用于各种与字符串处理相关的场合。它是一套独立的语言系统,经过几十年的完善和发展,现在已经非常的强大,并且形成了国际标准。各种高级编程语言,都实现了自己的表达式引擎。本课程详细的讲解了Java语言正则表达式的语法和使用技巧。掌握了正则表达式,对编程水平的提高有非常大的帮助!同时,本课程在最后一部分,安排了非常精彩的、完整的实战案例,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握字符串处理及正则表达式相关的系统知识,并能提高实际的编码水平。环境配置要求:学习本课程需安装JDK1.8或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。    因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

50,539

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧