php 中的正则表达式不包括值

Regex in php excluding values

我有这些文本行 ($text 变量)

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

现在我只想 return 收到每一行的数字部分。但重要的是我不必采用以某些字符开头的行,就像我想排除“SS”、“PP”和“FF”一样。 所以我希望它 return 我只有“CC”的值和没有前导字符的数字值。

在此期间我已经这样做了,但它似乎不起作用

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

不幸的是,我没有得到想要的结果,我哪里错了? 谢谢

您可以将否定前瞻锚定到字符串的开头,并在 .SS 中省略前导点,因为它匹配单个字符。

您也可以省略 {1}[\,\.]

中的反斜杠

由于示例中除了空格和 2 个大写字符外没有其他字符,您可以更改 .* 以匹配 [A-Z]{2} 后跟可选的水平空白字符 \h*

省略末尾的 \w+,因为没有更多的单词字符,而 + 至少需要一个字符。

^(?!SS|FF|PP)[A-Z]{2}\h*\K\d{1,2}[,.]\d{1,2}$
  • ^ 字符串开头
  • (?!SS|FF|PP) 不断言右边的任何选项
  • [A-Z]{2} 匹配 2 个大写字符
  • \h*\K 匹配可选的空白字符并忘记到目前为止匹配的内容
  • \d{1,2}[,.]\d{1,2} 匹配 1-2 位数字,后跟 .,,然后再匹配 1-2 位数字
  • $ 字符串结束

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]);

输出

Array
(
    [0] => 1,00
)

我将你的正则表达式修改为:^(?!SS|FF|PP).*(\d{1,2}[,.]\d{1,2})

在这里测试: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 
//                      )
//        ) 

这与以下两个数字匹配:

  • 从抄送开始
  • 没有任何前导字母字符