You can use a lookahead only to check if the string matched is before is
:
'([^']*)'\\s*(?=\\bis\\b)
See regex demo
Breakdown:
'
- single apostrophe
([^']*)
- capture group matching 0 or more characters other than '
'\\s*
- a single apostrophe and 0 or more whitespace symbols
(?=\\bis\\b)
- a lookahead making sure there is a whole word is
after the current position (after the '
with optional whitespaces)
Java demo:
Pattern ptrn = Pattern.compile("'([^']*)'\\s*(?=\\bis\\b)");
Matcher matcher = ptrn.matcher("RECOVERY: 'XXXXXXXXX' is UP");
if (matcher.find()) {
System.out.println(matcher.group(1));
}
UPDATE
I used a lookahead only because you used a non-capturing group in your original regex : (?:is)
. A non-capturing group that has no quantifier set or any alternation inside seems reduntant and can be omitted. However, people often get misled by the name non-capturing thinking they can exclude the substring matched by this group from the overall match. To check for presence or absence of some text without matching, a lookaround should be used. Thus, I used a lookahead.
Indeed, in the current scenario, there is no need in a lookahead since it makes sense in case you need to match subsequent substrings that start wiyh the same sequence of characters.
So, a better alternative would be
'([^']*)'\s*is\b
Java:
Pattern ptrn = Pattern.compile("'([^']*)'\\s*is\\b");