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}))?");
В настоящее время мое регулярное выражение будет принимать следующие типы ввода IP-адреса, но только один тип ввода за раз:
- ip: "47.1.2.3"
- диапазон: "47.1.2.3-4"
- диапазон IP-адресов: «47.1.2.3-47.1.2.4»
- IP в диапазоне: "47.1.2.3 до 4"
- диапазон IP-адресов: «от 47.1.2.3 до 47.1.2.4»
- IP-CIDR: "47.1.2.4/32"
- Маска IP: "47.1.2.4 255.255.255.255"
Я хотел бы изменить свое регулярное выражение, чтобы принимать комбинации из них, разделенные запятой или пробелом. В идеале регулярное выражение должно было бы называть группы захвата, как указано выше, чтобы упростить обработку.
Я хочу, чтобы следующее также было допустимым вводом, но я хочу иметь возможность извлекать совпадения, описанные выше, с именованными группами.
"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();
}
}
});
}
//методы класса.... }
Это класс RegexFormatter:
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
}
}