我到处寻找解决方案,我尝试过使用不同的正则表达式标志,但没有成功。
我有以下正则表达式模式:
private static String LAST_LOG = "/.*?Last login:.*?td.*?td.*?([A-Za-z]+).*?;([0-9]+).*?;([0-9]+).*?;([0-9]+):([0-9]+):([0-9]+).*?([A-Z]+)/";
我试图在string中找到匹配项。
如您所见,它找到了匹配项,并在7组(月,日,年,时,分,秒,时区)中捕获数据。
问题在于我根本没有匹配,我已经测试了字符串,它确实包含我正在寻找的部分,所以我找不到任何一个其他原因导致Android无效。
m = getMatcher(content,LAST_LOG);
if(m.find()) {
Log.e("Month",m.group(1));
Log.e("Day",m.group(2));
Log.e("Year",m.group(3));
Log.e("Hour",m.group(4));
Log.e("Minute",m.group(5));
Log.e("Second",m.group(6));
Log.e("Timezone",m.group(7));
}
private static Matcher getMatcher(String str, String regex){
Pattern pattern = Pattern.compile(regex);
return pattern.matcher(str);
}
这不是导致我麻烦的唯一正则表达式,我还有其他正在运行的正则表达式,但简单的修改使它们失败,即使在其他平台(和在线正则表达式测试人员)上也能正常工作。
我在Python脚本中使用相同的正则表达式并且它没有任何问题地工作:
regex_last = r'.*?Last login:.*?td.*?td.*?([A-Za-z]+).*?;([0-9]+).*?;([0-9]+).*?;([0-9]+):([0-9]+):([0-9]+).*?([A-Z]+)'
m = re.search(regex_last,content.decode())
if m:
print(m.group(1))
print(m.group(2))
print(m.group(3))
print(m.group(4))
print(m.group(5))
print(m.group(6))
print(m.group(7))
else:
print('No match')
输出:
Apr
07
2016
17
33
52
CEST
我接近转换为HTML解析器,但由于我已经在Python和Android中使用了正则表达式,并且我认为使用正则表达式可以更容易地在平台之间切换,我决定使用它们。
答案 0 :(得分:1)
您需要从开头和结尾删除/
。我也会从一开始就删除.*?
,因为它没有任何意义,但会减慢速度。
private static String LAST_LOG = "Last login:.*?td.*?td.*?([A-Za-z]+).*?;([0-9]+).*?;([0-9]+).*?;([0-9]+):([0-9]+):([0-9]+).*?([A-Z]+)";