我需要使用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:后向组没有明显的最大长度
我知道问题出在后面部分中的。*。还有其他避免错误的方法吗?
答案 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}')
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));
}
}