无法在Perl中使用特定的正则表达式

时间:2015-04-20 20:14:46

标签: regex perl

我有一个格式如下的字符串:

project-version-project_test-type-other_info-other_info.file_type

在大多数情况下,我可以从这个字符串中删除我需要的大部分信息。当我的版本中有一个额外的限定字符时(即通常为5个字符,但有时会添加第6个字符),我的麻烦就出现了。

以前,我使用子字符串来删除多余的信息并获取'project_test-type'但是,现在我需要切换到正则表达式(主要用于处理额外的版本字符)。我可以继续使用子串并根据我是否有额外的版本字符来改变长度,但正则表达式似乎更合适。

我尝试使用以下模式:

my ($type) = $_ =~ /.*-.*-(.*)-.*/;

但'project_test-type'中的额外' - '意味着我不能简单地使用该字符来填充我的正则表达式。

我可以使用什么正则表达式从我的字符串中获取'project_test-type'?


更多信息: 作为一个更易读的例子,信息按以下方式分组:

project - version - project_test-type - other_info - other_info . file_type
  • 'project'是一个简单的字符串
  • 'version'通常是5个整数的字符串,但有时后跟char,即11111是正常的,11111A是罕见的。
  • 'project_test-type'是与项目关联的特定测试,该项目可以同时包含'_'和' - '字符名称
  • 'other_info'的两种情况都是系统的附加信息,如IP地址或其他版本号。第一个没有固定的长度,而第二个总是10个字符

4 个答案:

答案 0 :(得分:5)

由于除了所需字段之外的任何字段都不能包含-,因此任何额外的-都属于所需的字段。

      +--------------------------- project
      |     +--------------------- version
      |     |   +----------------- project_test-type
      |     |   |      +---------- other_info
      |     |   |      |     +---- other_info.file_type
      |     |   |      |     |
  ____| ____|  _|  ____| ____|
/^[^-]*-[^-]*-(.*)-[^-]*-[^-]*\z/

[^-]匹配不是-的字符 [^-]*匹配零个或多个不是-的字符。

答案 1 :(得分:1)

匹配所有内容:

/^([^-]+)-([^-]+)-(.+)-([^-]+)-([^-]+)\.([a-zA-Z0-9]+)$/

[]定义字符集,^在集合的开头定义" NOT"。同样,集合中的-通常表示范围,除非它在开头或结尾。因此[^-]+消耗尽可能多的非短划线字符(至少一个)。

答案 2 :(得分:0)

您可以使用

/\w+\s*-\s*\d{5}[a-zA-Z]?\s*-\s*(.*?)(?=\s*-\s*\d)/

说明:

  • \w+\s*- ==>匹配字符序列,后跟任意数量的空格和-
  • \d{5}[a-zA-Z]? ==>总是5个数字,带有一个或零个字符
  • (.*?) =>以非贪婪的方式匹配一切
  • (?=\s*-\s*\d) =>期待一个数字并停止(因为IP以数字开头)

Demo and Explanation

答案 3 :(得分:0)

贪婪/非贪婪的方法

($type) = /.*?-.*?-(.*)-.*-.*/;

.*?是一个非贪婪的匹配,意味着匹配任何数字的任何数字,但不超过必要的匹配正则表达式。在第二个和第三个破折号之间使用.*是一个贪婪的匹配,匹配尽可能多的字符,同时仍然匹配正则表达式,并使用它将捕获带有任何额外破折号的单词。