正则表达式从行内容中提取文件名

时间:2013-01-09 12:19:32

标签: regex

我对正则表达非常新。我想提取以下字符串 “109_Admin_RegistrationResponse_20130103.txt”

从该文件内容中,每行选择内容:
01-10-13 10:44 AM 47 107_Admin_RegistrationDetail_20130111.txt
01-10-13 10:40 AM 11 107_Admin_RegistrationResponse_20130111.txt

正则表达式不应该选择第二行,只有第一行应该返回true。

3 个答案:

答案 0 :(得分:3)

你的正则表达式有很多不同的错误......

  1. 您的行不是以您需要的文件名开头,而是将^放在那里
  2. 您的角色组+中缺少[a-zA-Z],因此只能匹配单个字符
  3. 在您的角色组中不包含_,因此与Admin_RegistrationResponse不匹配
  4. 缺少\d{2}仅匹配dd
  5. 根据M42的答案(我遗漏了),你也需要逃避你的点.,或者它也会匹配123_abc_12345678atxt(注意a txt之前}})
  6. 你的正则表达式应该是

    \d+_[a-zA-Z_]+_\d{4}\d{2}\d{2}\.txt$

    可以简化为

    \d+_[a-zA-Z_]+_\d{8}\.txt$

    因为\d{2}\d{2}看起来多余 - 除非您想要捕获群组,否则您会这样做:

    \d+_[a-zA-Z_]+_(\d{4})(\d{2})(\d{2})\.txt$

答案 1 :(得分:1)

移除锚点并转义点:

\d+[a-zA-Z_]+\d{8}\.txt

答案 2 :(得分:0)

我是php的新手,但我认为你可以在php中使用explode()函数或者用你的语言中的任何等效函数。

$string = "01-09-13 10:17AM 11 109_Admin_RegistrationResponse_20130103.txt";
$pieces = explode("_", $string);

$stringout = "";
foreach($i = 0;$i<count($pieces);i++){
 $stringout = $stringout.$pieces[$i];
}