我需要能够使用/calendar/MyCalendar.ics,其中MyCalendar.ics可能与ICS扩展有关,并将其重写为/ feeds / ics / ics classic.asp?MyCalendar.ics
由于
答案 0 :(得分:0)
C:\x>perl foo.pl
Before: a=/calendar/MyCalendar.ics
After: a=/feeds/ics/ics_classic.asp?MyCalendar.ics
...or how about this way?
(regex kind of seems like overkill for this problem)
b=/calendar/MyCalendar.ics
index=9
c=MyCalendar.ics (might want to add check for ending with '.ics')
d=/feeds/ics/ics_classic.asp?MyCalendar.ics
以下是代码:
C:\x>type foo.pl
my $a = "/calendar/MyCalendar.ics";
print "Before: a=$a\n";
my $match = (
$a =~ s|^.*/([^/]+)\.ics$|/feeds/ics/ics_classic.asp?$1.ics|i
);
if( ! $match ) {
die "Expected path/filename.ics instead of \"$a\"";
}
print "After: a=$a\n";
print "\n";
print "...or how about this way?\n";
print "(regex kind of seems like overkill for this problem)\n";
my $b = "/calendar/MyCalendar.ics";
my $index = rindex( $b, "/" ); #find last path delim.
my $c = substr( $b, $index+1 );
print "b=$b\n";
print "index=$index\n";
print "c=$c (might want to add check for ending with '.ics')\n";
my $d = "/feeds/ics/ics_classic.asp?" . $c;
print "d=$d\n";
C:\x>
一般想法:
如果你用正则表达式解决了这个问题,那么一个半棘手的问题就是确保你的捕获组(parens)排除了路径分隔符。 有些事情需要考虑:
你的路径分隔符是否总是正斜杠?
正则表达式似乎有点矫枉过正;我能想到的最简单的事情是获取最后一个路径分隔符的索引并进行简单的字符串操作(示例程序的第二部分)。
库通常具有用于解析路径的例程。在Java中,我会查看java.io.File对象,例如,具体而言 的getName() 返回由表示的文件或目录的名称 这个抽象的路径名。这只是其中的姓氏 路径名的名称序列
答案 1 :(得分:0)
正则表达式用于搜索/匹配文本。通常,您将使用正则表达式来定义搜索某些文本操作工具的内容,然后使用特定于工具的方式告诉工具更换文本的内容。
正则表达式语法使用圆括号在整个搜索模式中定义捕获组。许多搜索和替换工具使用捕获组来定义要替换的匹配部分 我们可以将Java Pattern和Matcher类作为示例。要使用Java Matcher完成任务,您可以使用以下代码:
Pattern p = Pattern.compile("/calendar/(.*\.(?i)ics)");
Matcher m = p.matcher(url);
String rewritenUrl = "";
if(m.matches()){
rewritenUrl = "/feeds/ics/ics_classic.asp?" + url.substring( m.start(1), m.end(1));
}
这将找到所请求的模式,但只会使用第一个正则表达式组来创建新字符串。
这是一个非常好的正则表达式信息网站(imho)中正则表达式替换信息的链接:http://www.regular-expressions.info/refreplace.html