Search code examples
regexpcre

Regex for matching a certain number of words


I have the following string pattern, from which I'm trying to grab the first 4 to 5 words after the first occurrence of -:

OBJ: redacted - We can't save this record: because the “FBE Record-Trigger: redacted After Save” process failed. Give your Salesforce admin these details. This error occurred when the flow tried to update records: CANNOT_EXECUTE_FLOW_TRIGGER: We can't save this record because the “FBE Account To Oppty Partner AE” process failed. Give your admin these details. This error occurred when the flow tried to update records: UNABLE_TO_LOCK_ROW: unable to obtain exclusive access to this record or 32 records: 0068z0000025NS1AAM,006t0000003YfgFAAS,006t00000046pFEAAY,0068z0000027ULKAA2,0068z000002YmpsAAC,006t00000046p7bAAA,006t00000046p7OAAQ,0068z0000026AgJAAU,0068z0000029VutAAE,006t00000046p7LAAQ, ... (22 more).

In the above string, I'm trying to match the following text: We can't save this record:

I tried the following regex: -\s+\b(\w+)\b, which only captures the first word: we. I tried to quantify the captured group pattern using {5} with a back reference and without, still no luck. Also, I don't really need to capture, I just need to match the first n number of words after -.


Solution

  • To match words that may include apostrophes, instead of \w+ use [\w']+.

    This matches "We can't save this record:" from the sample input:

    (?<=- )(?:[\w':]+ ??){5}
    

    See live demo.

    Note the use of the reluctant optional quantifier ?? not match the space after the last word.

    Since the entire match is your target, if you need to refer to it, for example in a replacement expression, rather that naming it in a group, use group 0 (which means "the whole match").