Hi guys I am working on some regex to extract the FirstName and first letter of LastName from an account field, only if the account is a human account. Otherwise, if it is a service account I want to capture the full text in the same capturing group where I'd capture the FirstName.
Sounds simple enough but I am working with a naming convention that is not as well defined as I'd like which makes things hard. Here is the regex I have put together so far.
^((-?)(admin|top)-|ADMIN: )?(?<FirstName>[^\n] ?)(?(?= \w* ) (?<MiddleName>\w*)|(?= ?))(?(?= ) (?<LastName>[A-Z])|$)
Below are some examples of account names. I've highlighted with bold the parts that need to be captured by the regex.
- -admin-JohnS (here I want to grab JohnS in the FirstName capturing group)
- admin-JohnS
- ADMIN: John Smith (here the S needs to be captured by the LastName capturing group)
- -top-JohnS
- top-JohnS
- John Smith
- John Peter Smith
- -service-something
- service-something
- -svc-something
- svc-something
- svc.something
- SERVICE: Something
- someServiceAccount
The regex works great for almost all the occasions except for "SERVICE: Something" where "SERVICE:" is captured by the FirstName group and "S" is captured by the LastName capturing group. What can I do to fix this and capture all the text? I have tried a few things with negative lookaheads but didn't get me anywhere.
Thanks!
CodePudding user response:
You might use:
^(?:-?(?i:admin(?:: |-)|top-))?(?<FirstName>[^\s:] (?:: .*)?)(?: (?<MiddleName>\w (?= \w)))?(?: (?<LastName>[A-Z]))?
Explanation
^Start of string(?:Non capture group-?(?i:admin(?:: |-)|top-)Match optional-and eitheradmin:oradmin-ortop-case insensitive
)?Close the non capture group and make it optional(?<FirstName>[^\s:] (?:: .*)?)Match the first name consisting of any non whitespace char except:and then optionally match:and the rest of the line(?: (?<MiddleName>\w (?= \w)))?Match only the middle name if there is a following part with a space and a word char(?: (?<LastName>[A-Z]))?Optionally match a space and the first char of the last name
