如何在perl中使用(?:regex)匹配模式如下

时间:2012-06-01 12:21:46

标签: regex perl

$string = "hello/welcome";

我只想要“欢迎”。

$string = "hello-welcome-to-the-world";

我想要“你好 - 欢迎”

我试试这个

print $1 if($string =~ m#(?:/|)(.*)(?:-to-)#);  # got hello-welcome
print $1 if($string =~ m#(?:/)(.*)(?:-to-|)#);  # got welcome

但我无法从单个正则表达式获得所需的输出。 请解决并解释......

使用这个(?:\w.+/)?(.*?(?=$|-to-)),我得到了两个字符串的答案

2 个答案:

答案 0 :(得分:1)

这个正则表达式匹配你的两个案例。所需的输出也在$1

((?:\w+-)?welcome)

(?:\w+-)?可选地匹配欢迎之前的单词然后连字符。由于它可选择匹配,如果它不存在,输出只是“欢迎”。

答案 1 :(得分:0)

(?<=^|/).*?(?=$|-to-)

匹配(字符串或斜杠的开头)和(字符串的结尾或-to - )之间的最短匹配。

如果您使用环视,这是许多必须提取捕获组的情况中的另一个。

编辑:由于可变长度的后视不起作用,请尝试:

(?<![^/])[^/]*?(?=$|-to-)