Java – how to terminate matcher Find() when it runs too long?
I want to know the technology of terminating long-running regular expression matching (Java matcher. Find () method) Maybe inherit matcher and add some logic after X iterations to terminate?
Basically, I use genetic algorithm to generate regular expressions, so I don't have much control over them Then I test each text against some text to see if they match a target area of the text
Because I generated these regular expressions a little randomly, I got some crazy things. It ate a lot of CPU and some find () calls, which took a while to terminate I'd rather kill them after a while, but I'm not sure the best way
If anyone has an idea, please let me know
Solution
There is a solution here that can solve your problem That question is the same as yours
In essence, it is a charsequence that can notice thread interrupts
Code of the answer:
/** * CharSequence that noticed thread interrupts -- as might be necessary * to recover from a loose regex on unexpected challenging input. * * @author gojomo */ public class InterruptibleCharSequence implements CharSequence { CharSequence inner; // public long counter = 0; public InterruptibleCharSequence(CharSequence inner) { super(); this.inner = inner; } public char charAt(int index) { if (Thread.interrupted()) { // clears flag if set throw new RuntimeException(new InterruptedException()); } // counter++; return inner.charAt(index); } public int length() { return inner.length(); } public CharSequence subSequence(int start,int end) { return new InterruptibleCharSequence(inner.subSequence(start,end)); } @Override public String toString() { return inner.toString(); } }
With this wrapped string, you can break the thread