PHP正则表达式帮助 - 非常混淆如何构建它

时间:2012-11-22 16:25:49

标签: php regex

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

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

4 个答案:

答案 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]+

enter image description here

答案 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";