Extract text from a string

109,329

Solution 1

The following regex extract anything between the parenthesis:

PS> $prog = [regex]::match($s,'\(([^\)]+)\)').Groups[1].Value
PS> $prog
SUB RAD MSD 50R III

Explanation (created with RegexBuddy)

Match the character '(' literally «\(»
Match the regular expression below and capture its match into backreference number 1 «([^\)]+)»
   Match any character that is NOT a ) character «[^\)]+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character ')' literally «\)»

Further Reading:

Solution 2

If program name is always the first thing in (), and doesn't contain other )s than the one at end, then $yourstring -match "[(][^)]+[)]" does the matching, result will be in $Matches[0]

Solution 3

Just to add a non-regex solution:

'(' + $myString.Split('()')[1] + ')'

This splits the string at the parentheses and takes the string from the array with the program name in it.

If you don't need the parentheses, just use:

$myString.Split('()')[1]

Solution 4

Using -replace

 $string = '% O0033(SUB RAD MSD 50R III) G91G1X-6.4Z-2.F500 G3I6.4Z-8.G3I6.4 G3R3.2X6.4F500 G91G0Z5. G91G1X-10.4 G3I10.4 G3R5.2X10.4 G90G0Z2. M99 %'
 $program = $string -replace '^%\sO\d{4}\((.+?)\).+$','$1'
 $program

SUB RAD MSD 50R III
Share:
109,329
resolver101
Author by

resolver101

Updated on January 24, 2022

Comments

  • resolver101
    resolver101 over 2 years

    How do I extract the "program name" from a string. The string will look like this :

    % O0033(SUB RAD MSD 50R III) G91G1X-6.4Z-2.F500 G3I6.4Z-8. G3I6.4 G3R3.2X6.4F500 G91G0Z5. G91G1X-10.4 G3I10.4 G3R5.2X10.4 G90G0Z2. M99 %

    The program name is (SUB RAD MSD 50R III). Storing the result in another string is fine. I'm learning powershell so any explaination of your answers will be appreciated.

  • resolver101
    resolver101 about 12 years
    Thanks for your answer. Can you explain and break this down or how can i learn about regex? Any recomended good sites.
  • resolver101
    resolver101 about 12 years
    There are multiple lines with "()". The pattern is
  • mjolinor
    mjolinor about 12 years
    regex adjusted for new requirements
  • Solomon Duskis
    Solomon Duskis almost 4 years
    ...and since -match returns a boolean, you probably want something like if($something -match "regexp") { $Matches[0] } else { '' } in an expression context.