【问题标题】:Look-behind issue with java regex. Look-behind group does not have an obvious maximum lengthjava 正则表达式的后视问题。后视组没有明显的最大长度
【发布时间】:2019-07-05 15:50:47
【问题描述】:

我需要使用 Java RegEx 匹配 xml 文档中 <noteinfo> 标记内的 sequence='999'(xml 解析器不是一个选项)。

xml 片段:

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

我正在使用这个:(?&lt;=&lt;noteinfo.*)sequence='[0-9999]'(?=/&gt;)

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

出现错误:java.util.regex.PatternSyntaxException:后视组没有明显的最大长度

我知道问题出在后视部分的 .* 上。有什么办法可以避免这个错误?

【问题讨论】:

  • Any alternatives to avoid the error? 使用解析器。说真的,这是唯一的方法。

标签: java regex lookbehind


【解决方案1】:

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

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

使用以下命令读取文件:

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

Pattern.MULTILINE 在注释信息行被包装的情况下是必需的
seqpat 找到(不匹配!)任何以&lt;noteinfo 开头并以&gt; 结尾的行
请求的序列被捕获在group( "seq" )
也许您必须处理 sequence、= 和序列 ID '3' 之间的空格或换行符 - 因此:\\s*=\\s*

上面的 Pattern 会找到每个 sequence-id(甚至是一个 empy)
要仅查找 '999' 序列 ID,请使用此模式:
Pattern.compile( "&lt;noteinfo[^&gt;]+(?&lt;seq&gt;sequence\\s*=\\s*'999')", Pattern.MULTILINE );

【讨论】:

    【解决方案2】:

    我的猜测是你可能想要设计一个类似的表达式:

    (?=<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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多