正则表达式以递归方式捕获这些模式

Regex to catch these patterns recursively

    java.util.regex.Pattern ips
        = java.util.regex.Pattern.compile("(\d{1,3}(?:\.\d{1,3}){2}\.(\d{1,3}))(?:(?:-|\s+to\s+)(\d{1,3}(?![\d\.]))|(?:-|\s*to\s+)(\d{1,3}(?:\.\d{1,3}){3})|\s+(25\d(?:\.\d{1,3}){3})|\s*\/(\d{1,3}))?");

目前我的 Regex 将接受以下类型的 IP 地址输入,但一次只能接受一种输入类型:

我想修改我的正则表达式以接受用逗号或 space 分隔的这些组合。理想情况下,正则表达式会按照上面列出的方式命名捕获组,以便于处理。

我希望以下内容也是有效输入,但我希望能够提取上述与命名组的匹配项。

"47.1.2.3 to 4, 47.1.2.7, 47.1.3.9-47.1.3.19"

我正在尝试使用正则表达式来验证文本字段中的输入。以下代码是文本字段:

public class HostCollectionTextField extends JFormattedTextField implements CellEditor, MouseListener {

ArrayList listeners = new ArrayList();
HostCollection hc;
java.util.regex.Pattern ips
        = java.util.regex.Pattern.compile("(\d{1,3}(?:\.\d{1,3}){2}\.(\d{1,3}))(?:(?:-|\s+to\s+)(\d{1,3}(?![\d\.]))|(?:-|\s*to\s+)(\d{1,3}(?:\.\d{1,3}){3})|\s+(25\d(?:\.\d{1,3}){3})|\s*\/(\d{1,3}))?");

public HostCollectionTextField() {
    this.addMouseListener(this);
    this.hc = new HostCollection();

    this.setFormatterFactory(new AbstractFormatterFactory() {

        @Override
        public JFormattedTextField.AbstractFormatter getFormatter(JFormattedTextField tf) {
            RegexFormatter f = new RegexFormatter(ips);
            return f;
        }
    });
    this.getDocument().addDocumentListener(new DocListener(this));
    addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            if (stopCellEditing()) {
                fireEditingStopped();
            }
        }
    });

}

//class 方法.... }

这是 RegexFormatter Class:

public class RegexFormatter extends DefaultFormatter {

protected java.util.regex.Matcher matcher;

public RegexFormatter(java.util.regex.Pattern regex) {
    setOverwriteMode(false);
    matcher = regex.matcher(""); // create a Matcher for the regular expression
}

public Object stringToValue(String string) throws java.text.ParseException {
    if (string == null) {
        return null;
    }
    matcher.reset(string); // set 'string' as the matcher's input

    if (!matcher.matches()) // Does 'string' match the regular expression?
    {
        throw new java.text.ParseException("does not match regex", 0);
    }

    // If we get this far, then it did match.
    return super.stringToValue(string); // will honor the 'valueClass' property
}

}

ip部分比较独特,应该没问题
比赛期间使用空格 and/or 逗号作为分隔符的重叠部分。

您可能需要同一个正则表达式的两个版本。
一个用于验证,一个用于提取。

要提取的只是您在全局匹配中使用的原始正则表达式。
这在验证后使用。

验证一个在下面。它使用
一次匹配多个 ip 部分 锚 ^$ 与嵌入在 using
之间的原始量化正则表达式 所需的分隔符 [\s,]+

不确定这是否适用于您的验证码,但如果输入 现在一个单独的 ip 部分,工作,那么这应该。

验证正则表达式:

"^(?:\d{1,3}(?:\.\d{1,3}){2}\.\d{1,3}(?:(?:-|\s+to\s+)\d{1,3}(?![\d\.])|(?:-|\s*to\s+)\d{1,3}(?:\.\d{1,3}){3}|\s+25\d(?:\.\d{1,3}){3}|\s*\/\d{1,3})?(?:[\s,]*$|[\s,]+))+$"

格式化:

 ^     
 (?:
      \d{1,3} 
      (?: \. \d{1,3} ){2}
      \.
      \d{1,3} 
      (?:
           (?: - | \s+ to \s+ )
           \d{1,3} 
           (?! [\d\.] )
        |  
           (?: - | \s* to \s+ )
           \d{1,3} 
           (?: \. \d{1,3} ){3}
        |  
           \s+ 
           25 \d 
           (?: \. \d{1,3} ){3}
        |  
           \s* \/
           \d{1,3} 
      )?

      (?:
           [\s,]* $ 
        |  
           [\s,]+  
      )
 )+
 $  

编辑: 将组名添加到提取正则表达式。

 # "(?<IP>\d{1,3}(?:\.\d{1,3}){2}\.(?<From_Seg>\d{1,3}))(?:(?:-|\s+to\s+)(?<To_Seg>\d{1,3}(?![\d\.]))|(?:-|\s*to\s+)(?<To_Range>\d{1,3}(?:\.\d{1,3}){3})|\s+(?<Mask>25\d(?:\.\d{1,3}){3})|\s*/(?<Port>\d{1,3}))?"

 (?<IP>                        # (1), IP
      \d{1,3} 
      (?: \. \d{1,3} ){2}
      \.
      (?<From_Seg> \d{1,3} )        # (2), From segment
 )
 (?:
      (?: - | \s+ to \s+ )
      (?<To_Seg>                    # (3), Dash/To segment
           \d{1,3} 
           (?! [\d\.] )
      )
   |  
      (?: - | \s* to \s+ )
      (?<To_Range>                  # (4), Dash/To range
           \d{1,3} 
           (?: \. \d{1,3} ){3}
      )
   |  
      \s+     
      (?<Mask>                      # (5), Mask
           25 \d 
           (?: \. \d{1,3} ){3}
      )
   |  
      \s* /     
      (?<Port>                      # (6), Port
           \d{1,3} 
      )
 )?