2

sme がhttp://gskinner.comで正常に実行されているのに、C# コードでパターンが一致しない理由を知りたいと思っています。パターンは次のとおりです。

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$

合わせたい

私はC#で試しました--

YoutubeVideoRegex = new Regex(@"^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$", RegexOptions.IgnoreCase);

youtubeMatch = YoutubeVideoRegex.Match(url);
if (youtubeMatch.Success)
{
id = youtubeMatch.Groups[1].Value; // I want this                
}

しかし、それは一致していません。助けてください?

4

2 に答える 2

3

Groups[1] にアクセスしようとしていますが、正規表現がグループをキャプチャしていないようです。定義していないサブグループにアクセスしようとする代わりに、youtubeMatch.ToString または Groups[0] を使用して目的のもの (マッチ全体) を取得することはできませんか?

編集

?:括弧の最後のセットからを削除すると、あなたの表現がうまくいくようです。私の理解では、括弧で囲まれた式がで始まる場合は、式をグループにキャプチャしたくない?:ことを明示的に示しており、で始まる場合は、ゼロ幅のアサーションを定義しています。 width、明らかに何もキャプチャしません。データを入力したい場合は、実際に何かをキャプチャする式にいくつかの括弧が必要です?=Groups

編集

これまでのコメントと、何をしようとしているのかについての推測に基づいて、更新された正規表現とそれを示す更新されたコードを次に示します。コメントで言及した2つのURLで機能しますが、1つは機能しません。

var re = new System.Text.RegularExpressions.Regex(
   @"^http:\/\/(?:www\.)?youtube.com\/watch\?[^?]*v=(\w+)\b[^\s?]*$",
   System.Text.RegularExpressions.RegexOptions.IgnoreCase);
var match = re.Match(textBox1.Text);
if (match.Success)
{
   textBox2.Text = match.Value;

   if (match.Groups.Count > 1)
      textBox3.Text = match.Groups[1].Value;
   else
      textBox3.Text = "Group missing";
}
else
{
   textBox2.Text = "(No match)";
   textBox3.Text = string.Empty;
}

textBox2 には一致する URL 全体が入力され、textBox3 には「v」クエリ パラメータのみが入力されます。

于 2013-10-17T16:28:18.233 に答える
2

私はちょうどあなたのコードを実行しました、そしてそれはhttpであなたの2つの例に一致します: ->

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports http://www.youtube.com/watch?v=KsH63qJlIMM

しかし、これではありません->

www.youtube.com/watch?v=KsH63qJlIMM

http:正規表現で必要とされるものがないことは明らかです。それをオプションにしたいですか?

もしそうなら、それを作ってください:

^(http:\/\/)?(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$

そしてそれはそれをうまくつかみます

于 2013-10-17T16:25:58.440 に答える