Java正则表达式的后向问题。后向组没有明显的最大长度

时间:2019-07-05 15:50:47

标签: java regex lookbehind

我需要使用Java RegEx在XML文档的sequence='999'标记内匹配<noteinfo>(不是XML解析器)。

xml片段:

<xmltag sequence='11'>
  <noteinfo noteid='1fe' unid='25436AF06906885A8525840B00805DBC' sequence='3'/>
</xmltag>

我正在使用:(?<=<noteinfo.*)sequence='[0-9999]'(?=/>)

我期待与此匹配:sequence='3'

获取错误:java.util.regex.PatternSyntaxException:后向组没有明显的最大长度

我知道问题出在后面部分中的。*。还有其他避免错误的方法吗?

2 个答案:

答案 0 :(得分:0)

如果不是绝对必要的话,切勿使用后视

您可以使用花括号减少后视的长度。 {1,255}
您的问题无需解决即可解决:
static final Pattern seqpat = Pattern.compile( "<noteinfo[^>]+(?<seq>sequence\\s*=\\s*'[\\d]*')", Pattern.MULTILINE );

通过以下方式通读文件:

Matcher m = seqpat.matcher( s );
while( m.find() )
  System.err.println( m.group( "seq" ) );

Pattern.MULTILINE对于包裹noteinfo-行的情况是必需的
seqpat查找(不匹配!)以<noteinfo开始并以>结尾的任何行
请求的序列在group( "seq" )中捕获
也许您必须处理sequence=和序列ID '3'之间的空格或换行符-因此:\\s*=\\s*

上述模式会找到每个序列号(甚至是一个空号)
要仅找到'999'序列号,请采用以下模式:
Pattern.compile( "<noteinfo[^>]+(?<seq>sequence\\s*=\\s*'999')", Pattern.MULTILINE );

答案 1 :(得分:-1)

我的猜测是,您可能希望设计一个类似于以下内容的表达式:

(?=<noteinfo).*(sequence='[0-9]'|sequence='[1-9][0-9]{0,3}')

DEMO

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(?=<noteinfo).*(sequence='[0-9]'|sequence='[1-9][0-9]{0,3}')";
final String string = "<xmltag sequence='11'>\n"
     + "  <noteinfo noteid='1fe' unid='25436AF06906885A8525840B00805DBC' sequence='3'/>\n"
     + "</xmltag>\n"
     + "<xmltag sequence='11'>\n"
     + "  <noteinfo noteid='1fe' unid='25436AF06906885A8525840B00805DBC' sequence='9999'/>\n"
     + "</xmltag>\n"
     + "<xmltag sequence='11'>\n"
     + "  <noteinfo noteid='1fe' unid='25436AF06906885A8525840B00805DBC' sequence='10000'/>\n"
     + "</xmltag>\n"
     + "<xmltag sequence='11'>\n"
     + "  <noteinfo noteid='1fe' unid='25436AF06906885A8525840B00805DBC' sequence='-1'/>\n"
     + "</xmltag>";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}