Search code examples
phpregexpcre

Regex to match string after similar words


I am trying to parse the log file below; however I am a bit stuck on figuring out how to match the results after all the "Step=Number".

Step=10 , Step=11 , Step=12 , Step=13 , Step=14 , Step=15 , Step=16 , Step=18 , Step=17 , Step=20 , Step=19 , Step=25 , Step=21 , Step=26 , Step=28 , Step=24 , Step=22 , Step=23 , Step=27 , Step=30 , Step=29 , Step=35 , Step=34 , Step=32 , Step=31 , Step=38 , Step=37 , Step=36 , Step=50 , Step=45 , Step=48 , Step=41 , Step=52 , Step=42 , Step=57 , Step=65 , Step=61 , Step=62 , Step=64 , Step=54 , Step=53 , Step=59 , Step=63 , Step=84 , Step=71 , SelectedAuthenticationIdentityStores=paddedvalue, NetworkDeviceName=exampledevice, NetworkDeviceGroups=Update Source:All Sources:ACS, NetworkDeviceGroups=Device Type:All Device Types:Wireless, NetworkDeviceGroups=Location:All Locations, ServiceSelectionMatchedRule=Rule-1, IdentityPolicyMatchedRule=Default

I was thinking about matching after the combination of: \d\s\,\s

The ideal goal is to match the following:

SelectedAuthenticationIdentityStores=paddedvalue, NetworkDeviceName=exampledevice, NetworkDeviceGroups=Update Source:All Sources:ACS, NetworkDeviceGroups=Device Type:All Device Types:Wireless, NetworkDeviceGroups=Location:All Locations, ServiceSelectionMatchedRule=Rule-1, IdentityPolicyMatchedRule=Default

I tried the following regex: \d\s\\,\s(.*) but that matches everything after the first Step=Number (Step=10)


Solution

  • You can use another .* in the beginning of your existing pattern to greedily consume all but the last possible match:

    .*\d\s,\s(.*)
    

    Demo: https://regex101.com/r/Oc7jUK/1

    Alternatively, you can use a positive lookbehind pattern to ensure that the match is preceded by a \d\s,\s, and a negative lookahead pattern to ensure that there's no more \d\s,\s that follows:

    (?<=\d\s,\s)(?!.*\d\s,\s).*
    

    Demo: https://regex101.com/r/Oc7jUK/2