0

我有一个字符串列表(数字是字符串中不包含的行号!)

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]"

然后 OR 得到可选的前面部分:

([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])
4

4 回答 4

2

你很接近它应该是

if(preg_match('/\d+-\d+-\d+-\d+\s+[a-zA-Z\d]+/', $line))

\d类似于[0-9]

+表示匹配 1 到多个字符

\s+表示匹配 1 到多个空间

于 2012-11-22T16:29:00.457 回答
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";
于 2012-11-22T18:00:06.327 回答
0

试试这个模式

[0-9]+(-[0-9]+){3}\s[a-zA-Z0-9]+

或者

\d+(-\d+){3}\s[a-zA-Z\d]+

在此处输入图像描述

于 2012-11-22T16:30:07.760 回答
0

尝试这个

^(\d+ / )?\d+-\d+-\d+-\d+ \w+$
于 2012-11-22T16:47:49.857 回答