模式匹配器IllegalStateException

时间:2013-04-01 05:46:38

标签: java regex

我正在使用adventnet SNMPAPI开发UDP侦听程序。现在我需要将监听数据保存到数据库中。虽然我这样做,但我得到了错误。任何人都可以帮助解决这个问题...

这是我的代码。

import com.adventnet.snmp.beans.*; 
import com.adventnet.snmp.snmp2.*; 
import com.adventnet.snmp.snmp2.usm.*; 
import java.io.*; 
import java.net.*; 
import java.sql.*; 
import java.util.regex.*; 

public class trapreceiver { 

private static int MIBS = 0; 
private static int COMMUNITY = 1; 
private static int PORT = 2; 

private static int USER_NAME = 3; 
private static int ENGID = 4; 
private static int AUTH_PROTOCOL = 5; 
private static int AUTH_PASSWORD = 6; 
private static int PRIV_PASSWORD = 7; 
private static int DEBUG = 8; 
private static int CONTEXT_NAME = 9; 
private static int CONTEXT_ID = 10; 
private static int PRIV_PROTOCOL = 11; 
private static String Data; 
public static void main(String args[]) { 

// Take care of getting options 

String usage = "trapreceiver [-m MIB_files] [-c community] [-p port] [-u user] [-e engineID(1234.../0x1234...)] [-a authProtocol(MD5/SHA)] [-w auth_password] [-s priv_password] [-d] [-n contextName] [-i contextId] [ -pp priv_protocol(DES/AES-128/AES-192/AES-256/3DES) ]"; 
String options[] = { "-m" , "-c", "-p", "-u", "-e", "-a", "-w", "-s", "-d", "-n", "-i", "-pp" }; 
String values[] = { null, null, null, null, null, null, null, null, "None", null, null, null}; 
String DataReceived = null; 
String userName = null; 
int authProtocol = USMUserEntry.NO_AUTH; 
String authPassword = new String (""); 
String privPassword = new String (""); 
String engineID = null; 

int privProtocol = USMUserEntry.NO_PRIV; 
byte secLevel = 0; 

ParseOptions opt = new ParseOptions(args,options,values, usage); 
if (opt.remArgs.length!=0) opt.usage_error(); 

// instantiate a receiver object 
SnmpTrapReceiver receiver = new SnmpTrapReceiver(); 

//To load MIBs from compiled file 
receiver.getMibOperations().setLoadFromCompiledMibs(true); 

if (values[COMMUNITY] != null) receiver.setCommunity( values[COMMUNITY] ); 
try { // set trap port to listen on if specified - else port 162 

if (values[PORT] != null) { 
receiver.setPortWithExceptionMsg( Integer.parseInt(values[PORT]) ); 
} else { 
System.out.println("Trying to set port 162 as the receiver port..."); 
receiver.setPortWithExceptionMsg( 162 ); 
} 


if (values[USER_NAME] != null) { 
userName = values[USER_NAME]; 
receiver.setPrincipal(userName); 
} 

if (values[ENGID] != null) { 
engineID = values[ENGID]; 
if(engineID.startsWith("0x") || engineID.startsWith("0X")) 
engineID = new String(gethexValue(values[ENGID])); 
} 

if (values[AUTH_PROTOCOL] != null) { 
if(engineID == null)    { 
System.out.println("EngineID is missing"); 
opt.usage_error(); 
} 
if ( values[AUTH_PROTOCOL].equals("SHA")) 
authProtocol = USMUserEntry.SHA_AUTH; 
else if ( values[AUTH_PROTOCOL].equals("MD5")) 
authProtocol = USMUserEntry.MD5_AUTH; 
else 
authProtocol = USMUserEntry.NO_AUTH; 
receiver.setAuthProtocol(authProtocol); 
receiver.setTrapAuthEnable(true); 
secLevel |= 0x01; 
} 

if (values[AUTH_PASSWORD] != null) { 
if(engineID == null)    { 
System.out.println("EngineID is missing"); 
opt.usage_error(); 
} 
if (secLevel == 0x01) { 
authPassword = values[AUTH_PASSWORD]; 
receiver.setAuthPassword(authPassword); 
} 
else 
opt.usage_error(); 
} 

if(values[PRIV_PASSWORD] != null) { 
if(engineID == null)    { 
System.out.println("EngineID is missing"); 
opt.usage_error(); 
} 
if (secLevel == 0x01) 
{ 
privPassword = values[PRIV_PASSWORD]; 
if(values[PRIV_PROTOCOL] != null) 
{ 
if(values[PRIV_PROTOCOL].equals("AES-128")) 
{ 
privProtocol = USMUserEntry.CFB_AES_128; 
} 
else if(values[PRIV_PROTOCOL].equals("AES-192")) 
{ 
privProtocol = USMUserEntry.CFB_AES_192; 
} 
else if(values[PRIV_PROTOCOL].equals("AES-256")) 
{ 
privProtocol = USMUserEntry.CFB_AES_256; 
} 
else if(values[PRIV_PROTOCOL].equals("3DES")) 
{ 
privProtocol = USMUserEntry.CBC_3DES; 
} 
else if(values[PRIV_PROTOCOL].equals("DES")) 
{ 
privProtocol = USMUserEntry.CBC_DES; 
} 
else 
{ 
System.out.println(" Invalid PrivProtocol "+values[PRIV_PROTOCOL]); 
opt.usage_error(); 
} 
} 

receiver.setPrivPassword(privPassword); 
receiver.setPrivProtocol(privProtocol); 

if(values[CONTEXT_NAME]!= null) 
receiver.setContextName(values[CONTEXT_NAME]); 
if(values[CONTEXT_ID]!= null) 
receiver.setContextID((values[CONTEXT_ID]).getBytes()); 

secLevel |= 0x02; 
} 
else 
opt.usage_error(); 
} 

} catch (NumberFormatException ex) { 
System.err.println("Invalid Integer Arg"); 
} catch (SnmpException se) { 
System.err.println(se); 
System.exit(1); 
} 

if(values[DEBUG].equals("Set")) 
receiver.setDebug(true); 

if(userName != null) 
receiver.createUserEntry(engineID.getBytes(),secLevel); 

if (values[MIBS] != null) try { // load MIB files 
System.err.println("Loading MIBs: "+values[MIBS]); 
receiver.loadMibs(values[MIBS]); 
System.err.println("Done."); 
} catch (Exception ex) { 
System.err.println("Error loading MIBs: "+ex); 
} 

// we need to instantiate a trap listener to listen for trap events 
TrapListener listener = new TrapListener() { 

// This method is called when trap is received by SnmpTrapReceiver 
public void receivedTrap(TrapEvent trap) { 
System.out.println("Got a trap from: "+trap.getRemoteHost()); 
// print PDU details 
String DataReceived = ((SnmpTrapReceiver)trap.getSource()).getMibOperations().toString(trap.getTrapPDU()); 
System.out.println(((SnmpTrapReceiver)trap.getSource()) 
.getMibOperations().toString(trap.getTrapPDU()) ); 
System.out.println("DataReceived :::: " + DataReceived); 
Pattern p = Pattern.compile("\\STRING.*?)\\."); 
Matcher m = p.matcher(DataReceived); 
m.find(); 
Data = m.group(1); 
System.out.println(Data); 

/*Connection con = null; 
String url = "jdbc:mysql://localhost:3306/"; 
String db = "snmp"; 
String driver = "com.mysql.jdbc.Driver"; 
Class.forName(driver); 
con = DriverManager.getConnection(url + db,"root","root"); 
Statement st = con.createStatement(); 
String sql = "INSERT INTO DataReceived(data) " + 
"VALUES ('"+m.group(1)+"')"; 
try 
{ 
int val = st.executeUpdate(sql); 
System.out.println("1 row affected"); 
catch (SQLException s) 
{ 
System.out.println("SQL statement is not executed!"); 
} 
}*/ 
if( trap.getTrapPDU().getCommand() == SnmpAPI.TRP_REQ_MSG) 
{ 
com.adventnet.snmp.mibs.MibTrap trapDefn = // get trap defn 
trap.getTrapDefinition(); 

if (trapDefn != null) // print name and description 
System.out.println("Trap Name: "+trapDefn.getName()+ 
"\nDescr: "+trapDefn.getDescription()); 
} 
else if( trap.getTrapPDU().getCommand() == SnmpAPI.TRP2_REQ_MSG) 
{ 

com.adventnet.snmp.mibs.MibNode notification = trap.getNotificationDefinition(); 
if(notification != null) 
System.out.println("Notification Name: "+notification.getLabel()+ 
"\nObjects: "+ notification.getObjects()+ 
"\nStatus: "+ notification.getStatus()+ 
"\nDescr: "+notification.getDescription()+ 
"\nParent: "+ notification.getParent()); 

} 
} 
/* 
Connection con = null; 
String url = "jdbc:mysql://localhost:3306/"; 
String db = "snmp"; 
String driver = "com.mysql.jdbc.Driver"; 

Class.forName(driver); 
con = DriverManager.getConnection(url + db,"root","root"); 
Statement st = con.createStatement(); 
String sql = "INSERT INTO DataReceived(data) " + 
"VALUES ('"+Data+"')"; 

int val = st.executeUpdate(sql); 
//System.out.println("1 row affected");*/ 
}; 

receiver.addTrapListener(listener); 

System.out.println("Trap Receiver started at port "+receiver.getPort()); 
} 


private static byte[] gethexValue(String value) 
{ 
byte temp; 
byte[] Key=new byte[value.length()/2 - 1]; 
String ss,str; 

ss = value.substring(2); 
for(int i = 0; i < ss.length(); i+=2) 
{ 
str = ss.substring(i,i+2); 
temp = (byte)Integer.parseInt(str,16); 
Key[i/2] = temp; 
} 
return Key; 
} 

} 

感谢Adv ..

关心, Himachandra C.

1 个答案:

答案 0 :(得分:1)

来自例外:

  

线程“Thread-1”中的异常java.lang.IllegalStateException:否   匹配发现
在java.util.regex.Matcher.group(Matcher.java:468)
在   snmpv3trapd.callback(snmpv3trapd.java:305)

代码:

String DataReceived = ...
...
Pattern p = Pattern.compile("\\STRING.*?)\\.");
Matcher m = p.matcher(DataReceived); 
m.find(); 
Data = m.group(1); 

m.group(1)行抛出异常。 错误No match found at java.util.regex.Matcher.group(...)只是声明收到的字符串(变量DataReceived)与任何地方的正则表达式都不匹配。

现在我相信你的代码还有别的东西。看一下"\\STRING.*?)\\."字符串,这是以下正则表达式:

\STRING.*?)\.

由于发生了不匹配的结束),这应该是错误的。现在,即使你纠正了这个,这个正则表达式可能与你的不相符。

第一个字符\S与字母S不匹配,而是与字符类\s(与空格匹配)的否定版本匹配。这样,以xTRING#TRING开头的字符串(依此类推)将匹配您的正则表达式。

总结一下:

我相信你想要在序列STRING之后和char .之前匹配字符串。为此,请使用正则表达式:

STRING(.*?)\.

因此模式为:

Pattern p = Pattern.compile("STRING(.*?)\\.");

现在m.group(1);会在匹配时生效。

如果您想在没有匹配项时避免异常,请检查m.find()的结果:

Pattern p = Pattern.compile("STRING(.*?)\\.");
Matcher m = p.matcher(DataReceived); 
Data = null;
if (m.find()) {
    Data = m.group(1);
}

注意:如果可以,请停止以大写字母启动变量的名称。这不是Java惯例。