我正在尝试在XML文件中创建一些模板,并且希望使用以下语法提供参数:
{%test%}其中“ test”是参数的名称.
private static final Pattern _hasArgPattern = Pattern.compile( "\\{%[a-zA-Z0-9_-]*%\\}" );
private static final Pattern _getArgNamePattern = Pattern.compile( "\\{%([a-zA-Z0-9_-]*)%\\}" );
private static final Pattern _replaceArgPattern = Pattern.compile( "(\\{%[a-zA-Z0-9_-]*%\\})" );
我首先检查字符串中是否存在参数,然后尝试提取参数的名称,然后将整个模式替换为HashMap中包含的参数值:
if( _hasArgPattern.matcher( attr ).matches() )
{
String argName = _getArgNamePattern.matcher( attr ).group( 1 );
if( ! args.containsKey( argName ) )
{
throw new Exception( "Argument \"" + argName + "\" not found." );
}
return _replaceArgPattern.matcher( attr ).replaceFirst( args.get( argName ) );
}
else
{
return attr;
}
我在一个在线reg exp测试仪上测试了我的reg exp,它们似乎按预期工作.
但是由于某些原因,尝试使用group()提取参数名称时出现异常:
java.lang.IllegalStateException: No successful match so far
这是什么原因?谢谢 :)
解决方法:
问题似乎在这条线上:
String argName = _getArgNamePattern.matcher( attr ).group( 1 );
您不能在调用matcher#find()或matcher#matches()方法之前调用matcher#group().