Java-Regexp组匹配异常

Java-Regexp组匹配异常,java,regex,exception,pattern-matching,extract,Java,Regex,Exception,Pattern Matching,Extract,我正在尝试在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_-]*)%\\}" ); pri

我正在尝试在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()提取参数名称时遇到了一个异常:


这是什么原因?谢谢:)

问题似乎出在这条线上:

String argName = _getArgNamePattern.matcher( attr ).group( 1 );

在调用
matcher#find()
matcher#matches()
方法之前,您不能调用
matcher#group()

谢谢您的帮助!我想我可以摆脱第一种模式。编辑:它可以工作。你无法摆脱它,否则你将如何填充
argName
?在使用
组之前,只需按我的建议调用
find
matches
。还要注意
args.get(argName)
它可能包含
$
或\个字符。是的。我还可以去掉第一个regexp。谢谢
String argName = _getArgNamePattern.matcher( attr ).group( 1 );