【发布时间】:2021-04-05 10:43:15
【问题描述】:
这个正则表达式捕获两位数的数字:
如果我有 y11 它仍然会捕获它,如何仅匹配 y0、y1、y2、y3、y4、y5、y6、y7、y8、y9 ?数字后可能有空格、字母或点。
preg_replace('/y([1-9]{1})/', 'y0$1', $string)
【问题讨论】:
-
[1-9]不会捕获0虽然
这个正则表达式捕获两位数的数字:
如果我有 y11 它仍然会捕获它,如何仅匹配 y0、y1、y2、y3、y4、y5、y6、y7、y8、y9 ?数字后可能有空格、字母或点。
preg_replace('/y([1-9]{1})/', 'y0$1', $string)
【问题讨论】:
[1-9] 不会捕获 0 虽然
我会匹配y\d(?!\d) 模式,它匹配y 后跟一个数字,它本身后面没有另一个数字。
$string = "y2";
echo $string . "\n";
$string = preg_replace("/y(\d)(?!\d)/", "y0$1", $string);
echo $string;
打印出来:
y2
y02
正则表达式的解释:
y the letter 'y'
(\d) a single digit (capture it)
(?!\d) assert that what follows is either a non digit character OR
the end of the input
【讨论】:
您可以省略 {1} 和 [1-9] 不匹配 0。该模式部分匹配例如 y11 中的 y1,因为该模式未锚定。
您可以匹配y 后跟一个数字,并声明一个空格、点或字母或字符串的结尾。
\by\K\d(?=[\h\p{L}.]|$)
模式匹配
\by 匹配 y 前面有一个单词边界\K 忘记到目前为止匹配的内容\d匹配单个数字0-9(?= 正向前瞻,断言右边是
[\h\p{L}.] 匹配水平空白字符、任意字母或点|或者$字符串结束) 关闭前瞻在替换中使用以0 开头的完整匹配
$pattern = "/\by\K\d(?=[\h\p{L}.]|$)/";
$strings = [
"y0",
"y1$",
"y2H",
"y3.",
"y9 ",
"y10",
"y09 y3 ay9"
];
foreach ($strings as $s) {
echo preg_replace($pattern, "0$0", $s) . PHP_EOL;
}
输出
y00
y1$
y02H
y03.
y09
y10
y09 y03 ay9
【讨论】:
使用您显示的示例,请尝试以下正则表达式。
^[a-zA-Z]\d[\s.a-zA-Z]?$
或者您想完全匹配从 y 开始的值,然后将上面的更改为:
^y\d[\s.a-zA-Z]?$
说明:为上述添加详细说明。
^ ##Mentioning ^ caret sign to denote starting of value.
[a-zA-Z] ##Checking 1 alphabet(small/capital letters) here.
\d ##Matching 1 single digit here.
[\s.a-zA-Z]? ##Checking either space OR DOT or small or capital letter to match, this is keep optional.
$ ##Mentioning end of the value here.
【讨论】:
[a-zA-Z]+(\d)([,\sa-zA-Z.]|\b)
[a-zA-Z]+ 匹配一个或多个字符。(\d) 匹配单个数字。将它们添加到捕获组中以供以后替换。([,\sa-zA-Z.]|\b) 匹配紧跟此逗号、空格或单词边界或字母的文本。$2 以在替换时保留其初始表示。片段:
<?php
$str = 'y0, y1, y2, y03, y4, y5, y6, y7, y8, y9, y99, y101';
$str = preg_replace('/[a-zA-Z]+(\d)([,\sa-zA-Z.]|\b)/','y0$1$2',$str);
echo $str;
【讨论】:
【讨论】: