站點用戶以不同方式輸入數字,例如:
from 8 000 packs
432534534
from 344454 packs
45054 packs
04 555
434654
54 564 packs
我正在尋找一個正則運算式,我可以用它突出顯示數字之前的單詞(如果有的話)、任何格式的數字和之后的單詞(如果有的話)。建議排除空格。
現在我有這樣的設計,但它不能正常作業。
(^[0-9|a-zA-Z].*?)\s([0-9].*?)\s([a-zA-Z]*$)
這樣做的主要目的是將字串按順序排列,使它們具有相同的形式,將它們格式化為 PHP 數字格式等。
結果,我需要將數字之前的文本、數字本身和它們之后的文本分別放入變數中。
$before = 'from';
$num = '8000';
$after = 'packs';
感謝您在這件事上的任何幫助)
uj5u.com熱心網友回復:
我想你可以試試這個:
^(\D )?([\d \t] )(\D )?$
- 第 1 組:可選(?)組,將包含除數字以外的任何內容
- 第 2 組:強制組,僅包含數字和空格字符,如空格和制表符
- 第 3 組:可選(?)組,將包含除數字以外的任何內容
演示
源(運行)
$re = '/^(\D )?([\d \t] )(\D )?$/m';
$str = 'from 8 000 packs
432534534
from 344454 packs
45054 packs
04 555
434654
54 564 packs
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
foreach ($matches as $matchgroup)
{
echo "before: ".$matchgroup[1]."\n";
echo "number:".preg_replace('/\D/m','',$matchgroup[2])."\n";
echo "after:".$matchgroup[3]."";
echo "\n\n\n";
}
uj5u.com熱心網友回復:
我更正了您的正則運算式并添加了組,正則運算式如下所示:
^(?<before>[a-zA-Z] )?\s?(?<number>[0-9].*?)\s?(?<after>[a-zA-Z] )?$`
在此處測驗正則運算式:https ://regex101.com/r/QLEC9g/2
通過使用組,您可以輕松地將單詞和數字分開,并以您想要的任何方式處理它們。
uj5u.com熱心網友回復:
您的模式不匹配,因為有 4 個必需部分都希望出現 1 個字符:
(^[0-9|a-zA-Z].*?)\s([0-9].*?)\s([a-zA-Z]*$)
^^^^^^^^^^^^ ^^ ^^^^^ ^^
需要注意的另一件事是第一個字符類[0-9|a-zA-Z]也可以匹配數字(您可以省略它,|因為它會匹配文字管道字符)
如果您允許左右所有其他字符而不是數字,并且應該至少存在一個數字,則可以使用否定字符類[^\d\r\n]*可選地匹配除數字或換行符之外的任何字符:
^([^\d\r\n]*)\h*(\d (?:\h \d )*)\h*([^\d\r\n]*)$
^字串的開始([^\d\r\n]*)捕獲組 1,匹配除數字或換行符以外的任何字符\h*匹配可選的水平空白字符(\d (?:\h \d )*)捕獲組 2,匹配 1 個數字,并可選擇重復匹配空格和 1 個數字\h*匹配可選的水平空白字符([^\d\r\n]*)捕獲組 3,匹配除數字或換行符以外的任何字符$字串結束
請參閱正則運算式演示和PHP 演示。
例如
$re = '/^([^\d\r\n]*)\h*(\d (?:\h \d )*)\h*([^\d\r\n]*)$/m';
$str = 'from 8 000 packs
test from 8 000 packs test
432534534
from 344454 packs
45054 packs
04 555
434654
54 564 packs';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
foreach($matches as $match) {
list(,$before, $num, $after) = $match;
echo sprintf(
"before: %s\nnum:%s\nafter:%s\n--------------------\n",
$before, preg_replace("/\h /", "", $num), $after
);
}
輸出
before: from
num:8000
after:packs
--------------------
before: test from
num:8000
after:packs test
--------------------
before:
num:432534534
after:
--------------------
before: from
num:344454
after:packs
--------------------
before:
num:45054
after:packs
--------------------
before:
num:04555
after:
--------------------
before:
num:434654
after:
--------------------
before:
num:54564
after:packs
--------------------
如果應該至少存在一個數字,并且單詞中唯一允許的字符是 az,則可以使用不區分大小寫的模式:
(?i)^((?:[a-z] (?:\h [a-z] )*)?)\h*(\d (?:\h \d )*)\h*((?:[a-z] (?:\h [a-z] )*)?)?$
查看另一個正則運算式演示和一個php 演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453909.html
上一篇:使用正則運算式從路徑中提取所有子路徑的最快方法是什么
下一篇:正則運算式它忽略第一個標簽
