我有一些代码从OBD-II适配器接收数据并通过一些正则表达式运行它,以便我可以识别包含故障代码的部分。就是这样。
dataRecieved = readMessage;
RX.setText(dataRecieved);
if((dataRecieved != null) && dataRecieved.matches("\\s*[A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2}\\s*\r?\n?")) {
if(D) Log.i(TAG, "REGEX ");
dataRecieved = dataRecieved.replace(">", "").trim();
DTC.setText(dataRecieved);
在正则表达式之后,我将收到的内容设置为android中的TextView。但是,当我运行它时没有文本集。我不知道这是否是我使用的正则表达式。它应该检测像
这样的东西>
01 00 14 53 00 00
包含或排除提示。
答案 0 :(得分:0)
matches()
方法期望正则表达式使用整个字符串,因此如果>
是邮件的一部分,则需要对其进行说明。
Pattern p = Pattern.compile(">\\s*((?:[A-F0-9]{2}\\s+){5}[A-F0-9]{2})\\s*");
Matcher m = p.matcher(dataRecieved);
if (m.matches())
{
DTC.setText(m.group(1));
}
通过创建Matcher对象而不是使用String的matches()
方法,我能够使用捕获组来提取您感兴趣的部分消息,从而无需replace()
和trim()
方法。
此外,\s
匹配换行和回车,因此\r?\n?
是多余的。
编辑:根据下面的评论,这是一个与后续行中的一个或多个故障代码匹配的版本:
">\\s+((?:(?:[A-F0-9]{2}\\s+){5}[A-F0-9]{2}\\s*)+)"
所有线都在一个块中捕获。这也会在最后一行的末尾捕获换行符(如果有的话),因此您可能需要将其修剪掉。