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 位数字
$
字符串结束
$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
// )
// )
这与以下两个数字匹配:
- 从抄送开始
- 没有任何前导字母字符
我有这些文本行 ($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 位数字$
字符串结束
$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
// )
// )
这与以下两个数字匹配:
- 从抄送开始
- 没有任何前导字母字符