正则表达式在开始时匹配精确数字(如99但不是999)

时间:2015-04-16 21:20:41

标签: php regex

这应该是一项简单的任务,但是整天都在寻找它我仍然无法弄清楚我缺少的东西

我正在尝试使用PHP的glob()打开一个文件,该文件以特定的编号

开头

目录中的文件名示例:

1.txt
123.txt
10 some text.txt
100 Some Other Text.txt

文件名始终以唯一编号开头(这是我需要用来查找正确的文件),并且可选地后跟空格和一些文本,最后是.txt扩展名

我的问题是,无论我做什么,如果我尝试匹配上面示例文件夹中的数字1,它将匹配以1开头的每个文件,但我只需要打开 完全 1开头的文件,无论它是什么,无论是空格和文本还是仅仅.txt

在该任务中成功的一些示例正则表达式:

filepath/($number)*.txt
filepath/([($number)])( |*.?)*.txt
filepath/($number)( |*.?)*.txt

我确信这有一个非常简单的解决方案...如果可能的话,我想避免将每个文件加载到PHP数组中,并使用PHP检查每个项目,只检查以确切数字开头的项目当肯定正则表达式可以在一个动作中完成它

如果您还知道如何将数字和扩展名之间的可选文本转换为变量,那么可以获得奖励,但这完全是可选的,因为在我想出这个之后这是我的下一个任务

4 个答案:

答案 0 :(得分:2)

您要使用的正则表达式为:^99(\D+\.txt)$

$re = "/^99(\D+\.txt)$/";
preg_match($re, $str, $matches);

这将匹配:

99.txt
99files.txt

但不是:

199.txt
999.txt
99
99.txt.xml
99filesoftxt.dat

( )周围的\D+.txt将创建一个包含您的文件名的捕获组。

答案 1 :(得分:1)

你可以使用这样的正则表达式:

^10\D.*txt$
  ^--- use the number you want

<强> Working demo

enter image description here

for intance:

$re = "/^10\\D.*txt$/m"; 
$str = "1.txt\n123.txt\n10 some text2.txt\n100 Some Other2 Text.txt"; 

preg_match_all($re, $str, $matches);
// will match only 10 some text.txt

答案 2 :(得分:1)

我相信这就是你想要的OP:

$regex = '/' . $number . '[^0-9][\S\s]+/';

这匹配数字,然后是任何不是数字的字符,然后是任何其他字符。如果数字为1,则匹配:

1.txt
1abc.txt
1 abc.txt
1_abc.txt
1qrx.txt

但它不匹配:

1
12.txt
2.txt
11.txt
1.

答案 3 :(得分:1)

你走了:

<?php
    function findFileWithNumericPrefix($filepath, $prefix)
    {   
        if (($dir = opendir($filepath)) === false) {
            return false;
        }

        while (($filename = readdir($dir)) !== false) {
            if (preg_match("/^$prefix\D/", $filename) === 1) {
                closedir($dir);
                return $filename;
            }
        }

        closedir($dir);

        return false;
    }

    $file = findFileWithNumericPrefix('/base/file/path', 1);                

    if ($file !== false) {
        echo "Found file: $file";
    }
?>

使用您的示例目录列表,结果为:

Found file: 1.txt