0

/calendar/MyCalendar.ics を取り、MyCalendar.ics が ICS 拡張機能を持つものであれば何でも取り、それを /feeds/ics/ics_classic.asp?MyCalendar.ics に書き換えられるようにする必要があります。

ありがとう

4

2 に答える 2

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

于 2012-07-19T17:38:32.253 に答える
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>

一般的な考え:

これを正規表現で解決する場合、ややトリッキーなビットは、キャプチャ グループ (括弧) がパス区切り記号を除外していることを確認することです。考慮すべき事項:

パスの区切り記号は常にスラッシュですか?

これには正規表現はやり過ぎのようです。私が考えることができる最も簡単なことは、最後のパス区切りのインデックスを取得し、単純な文字列操作を行うことです (サンプル プログラムの 2 番目の部分)。

ライブラリには、多くの場合、パスを解析するためのルーチンがあります。Java では、たとえば java.io.File オブジェクトを調べます。具体的には getName() この抽象パス名が示すファイルまたはディレクトリの名前を返します。これは、パス名の名前シーケンスの最後の名前です

于 2012-07-19T17:37:41.900 に答える