我有一个格式如下的字符串:
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
答案 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以数字开头)答案 3 :(得分:0)
贪婪/非贪婪的方法
($type) = /.*?-.*?-(.*)-.*-.*/;
.*?
是一个非贪婪的匹配,意味着匹配任何数字的任何数字,但不超过必要的匹配正则表达式。在第二个和第三个破折号之间使用.*
是一个贪婪的匹配,匹配尽可能多的字符,同时仍然匹配正则表达式,并使用它将捕获带有任何额外破折号的单词。