[英]Regex for single digit catches two digit numbers?
此正則表達式捕獲兩位數的數字:
如果我有 y11 它仍然會捕獲它,如何僅匹配 y0、y1、y2、y3、y4、y5、y6、y7、y8、y9? 在數字之后可能有一個空格或一個字母或一個點。
preg_replace('/y([1-9]{1})/', 'y0$1', $string)
我會匹配模式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;
}
Output
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.