我有一个字符串列表(数字是不包含在字符串中的行号!)
1. 2-1-44-1 WORD
2. 02-00-1030-1 WORD2
3. EKFOK (GI (I I((II(
4. 100-01-1-100 WORD3
5. 01 / 1-1-2-4 WORD4
6. 401 / 100-230-3-3 WORD5
.
.
.
我希望只能从列表中选择具有以下结构的行1,2,4,5和6:
{STRING[NUM] / }STRING[NUM]-STRING[NUM]-STRING[NUM]-STRING[NUM] STRING[A-Z-NUM]
{STRING [NUM] /}是可选的。
所以我写道:
if(preg_match("[0-9]-[0-9]-[0-9]-[0-9] [a-zA-Z0-9]", $line))
echo $line . '<br>';
但是它表示未知的修饰符-
。我试图逃避-
,但它仍然给我带来了问题。
我在考虑使用我的表达方式:
"[0-9]-[0-9]-[0-9]-[0-9] [a-zA-Z0-9]"
然后或者它来获得可选的前部部分:
([0-9] / [0-9]-[0-9]-[0-9]-[0-9] [a-zA-Z0-9])|([0-9]-[0-9]-[0-9]-[0-9] [a-zA-Z0-9])
答案 0 :(得分:2)
你很接近应该是
if(preg_match('/\d+-\d+-\d+-\d+\s+[a-zA-Z\d]+/', $line))
\d
与[0-9]
+
表示将1与多个字符匹配
\s+
表示匹配1到多个空格
答案 1 :(得分:0)
尝试这种模式
[0-9]+(-[0-9]+){3}\s[a-zA-Z0-9]+
或
\d+(-\d+){3}\s[a-zA-Z\d]+
答案 2 :(得分:0)
试试这个
^(\d+ / )?\d+-\d+-\d+-\d+ \w+$
答案 3 :(得分:0)
我从@kuya_John获取正则表达式,而不是我修改为返回一个全部匹配的数组(也是可选部分)。
$p="#((\d+\s+/\s+|)(\d+(-\d+){3}\s[a-zA-Z\d]+\n)|.*\n)#ismU";
$b=file_get_contents('text_to_parse.txt');
preg_match_all($p,$b,$m));
//var_dump($m);
echo "line 1,6 \"full\" match\n";
echo "1: ".trim($m[0][0])."\n";
echo "2: ".trim($m[0][1])."\n";
echo "4: ".trim($m[0][3])."\n";
echo "5: ".trim($m[0][4])."\n";
echo "6: ".trim($m[0][5])."\n";
echo "line 5,6 \"base\" part\n";
echo "5: ".trim($m[3][4])."\n";
echo "6: ".trim($m[3][5])."\n";
echo "line 5,6 \"optional\" part\n";
echo "5: ".trim($m[2][4])."\n";
echo "6: ".trim($m[2][5])."\n";