-
Notifications
You must be signed in to change notification settings - Fork 92
Description
Hi,
Can you give me some feedback on this issue?
I'm trying to mach Named capture groups in a multiline byte[] content and getting a -1 -1 index range for group2 for pattern (A).
Pattern A is: (?[0-9.]{1,5}%)|(?dev = .*)
However, pattern (B) works fine for non multiline (\n) content.
Pattern B is: (?[0-9.]{1,5}%).*(?dev = .*)
Debug regex on: https://regex101.com/r/y2ER1a/1
Content (with multiline) is:
Content >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=57 time=12.934 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=13.145 ms
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 12.934/13.040/13.145/0.106 ms
Content <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
My debug output is:
result = 226
D region Region:
0: (226-230) 1: (226-230) 2: (-1--1)
D nameEntry loss 1
loss -> 226, 230
0.0%
D nameEntry rtt 2
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
My code is:
public class RegexOutputPluginHandler {
private byte[] patternBytes;
private Regex regex = null;
public RegexOutputPluginHandler() {
String pattern = "(?<loss>[0-9\\.]{1,5}%)|(?<rtt>dev = .*)";
if (pattern != null) {
this.patternBytes = pattern.getBytes();
this.regex = new Regex(this.patternBytes, 0, this.patternBytes.length, Option.MULTILINE, UTF8Encoding.INSTANCE);
}
}
public Map<String, Object> extract(byte[] content) {
System.err.println("D content " + content);
if (content == null) {
return null;
}
System.err.println("D content len " + content.length);
Map<String, Object> fields = new HashMap<String, Object>();
Matcher matcher = regex.matcher(content);
int result = matcher.search(0, content.length, Option.MULTILINE);
System.out.println("result = " + result);
if (result != -1) {
Region region = matcher.getEagerRegion();
System.out.println("D region " + region.toString());
for (Iterator<NameEntry> entry = regex.namedBackrefIterator(); entry.hasNext();) {
NameEntry e = entry.next();
System.out.println("D nameEntry " + e.toString());
int number = e.getBackRefs()[0]; // can have many refs per name
int begin = region.beg[number];
int end = region.end[number];
String fieldName = new String(e.name, e.nameP, e.nameEnd - e.nameP);
String fieldContent = new String(content, begin, end - begin);
System.out.println(fieldName + " -> " + begin + ", " + end);
System.out.println(fieldContent);
}
}else {
System.err.println("D matcher none");
}
return fields;
}
}