Home > OS >  Regex in php excluding values
Regex in php excluding values

Time:03-17

I have these lines of text ($text variable)

CC 1,00
SS 1,00
PP 1,00
1,00
FF 1,00

now I would like to have only the numeric part of each line returned to me. But the important thing must be that I don't have to take lines that start with certain characters, like I would like to exclude "SS", "PP" and "FF". So I would like it to return me only the values of "CC" and only the numeric ones without leading characters.

In the meantime I have done this but it doesn't seem to work

preg_match_all("/((?!.SS|.FF|.PP).*\d{1,2}[\,\.]{1}\d{1,2})\w /", $text, $matches);

Unfortunately, I don't get the desired result, where am I wrong? Thanks

CodePudding user response:

I modified your regex to this: ^(?!SS|FF|PP).*(\d{1,2}[,.]\d{1,2})

Test here: https://regex101.com/r/SAivli/2

$re = '/^(?!SS|FF|PP).*(\d{1,2}[,.]\d{1,2})$/m';
$str = 'CC 1,00
SS 1,00
PP 1,00
1,00
FF 1,00';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
print_r($matches);
//Array ( [0] => Array ( 
//                        [0] => CC 1,00 
//                        [1] => 1,00 
//                      )
//         [1] => Array ( [0] => 1,00
//                        [1] => 1,00 
//                      )
//        ) 

This matches both the numbers that:

  • begin with CC
  • dont have any leading alpha characters

CodePudding user response:

You can anchor the negative lookahead to the start of the string, and omit the leading dots in .SS as it matches a single character.

You can also omit the {1} and the backslashes in [\,\.]

As there are no other characters in the examples besides spaces and 2 uppercase characters, you can change .* to match [A-Z]{2} followed by optional horizontal whitespace chars \h*

Omit the \w at the end because there are no more word characters and the expects at least a single char.

^(?!SS|FF|PP)[A-Z]{2}\h*\K\d{1,2}[,.]\d{1,2}$
  • ^ Start of string
  • (?!SS|FF|PP) Assert not any of the alternatives to the right
  • [A-Z]{2} Match 2 uppercase chars
  • \h*\K Match optional whitespace chars and forget what is matched so far
  • \d{1,2}[,.]\d{1,2} Match 1-2 digits followed by either . or , and again 1-2 digits
  • $ End of string

regex demo

$re = '/^(?!SS|FF|PP)[A-Z]{2}\h*\K\d{1,2}[,.]\d{1,2}$/m';
$text = 'CC 1,00
SS 1,00
PP 1,00
1,00
FF 1,00';

preg_match_all($re, $text, $matches);

print_r($matches[0]);

Output

Array
(
    [0] => 1,00
)
  • Related