正则表达式的问题,如何使用\ S直到特殊字符?

时间:2010-12-17 12:55:09

标签: c# asp.net regex

我收到了文字:

192.168.20.31 Url=/flash/56553550_hi.mp4?token=(uniquePlayerReference=81781956||videoId=1) 

我试图获取uniquePlayerReference和videoId

我试过这个正则表达式:

(?<=uniquePlayerReference=)\S*

但匹配:

81781956||videoId=1) 

然后我尝试用这个获取视频ID:

(?<=videoId=)\S*

但它与videoId之后匹配。

我的问题有两个:

1)我如何使用\ S字符并让它停在角色? (基本上是什么样的正则表达式做我想要的)我不能让它停在一个定义的角色,我想我需要使用一个积极的前瞻匹配,但不包括双管道。)

2)我什么时候应该使用括号?

4 个答案:

答案 0 :(得分:2)

鉴于这两个ID都是数字,您最好使用\d代替\S\d仅匹配数字,而\S匹配任何非空白字符。

你可能还会做的是在你不想匹配的角色之前进行非匹配:

uniquePlayerReference=(.*?)\|\|videoId=(.*?)\)

请注意,我已经转义了|)个字符,因为否则它们会在正则表达式中具有特殊含义。

在C#中你会像这样使用它:(它也回答你的问题括号的含义,它们是为了捕获匹配结果的部分)。

Regex regex = new Regex(@"uniquePlayerReference=(.*?)\|\|videoId=(.*?)\)");
Match match = regex.Match(
    "192.168.20.31 Url=/flash/56553550_hi.mp4?token=(uniquePlayerReference=81781956||videoId=1)");

if (match.Success)
{
    string playerReference = match.Groups[1].Value;
    string videoId = match.Groups[2].Value;
    // Etc.
}

答案 1 :(得分:2)

问题是你在这里的mul; tiplicity运算符 - * - 意思是“尽可能多”。如果你有一个明确的数字,你可以使用运算符{a,b},其中a是最小值,最大数量是匹配的,但如果你有一个未知的数字,你就不能使用\ S(这太过一般了)。

至于括号,如果您的意思是(),则使用它们来捕获匹配的一部分以进行反向引用。有点复杂,认为你需要使用reference

我想你想要这样的东西:

/uniquePlayerReference=(\d+)||videoId=(\d+)/i

然后分别反向引用\ 1和\。

答案 2 :(得分:1)

\ S表示它匹配任何非空白字符,包括右括号。因此,如果你必须使用\ S,你必须明确地说在结束括号处停止,如下所示:

videoId=(\S+)\)

因此,最好使用\ d,因为你要找的是数字:

uniquePlayerReference=(\d+)
videoId=(\d+)

答案 3 :(得分:1)

如果ID不仅仅是数字,那么您可以使用[^|]代替\S,即

(?<=uniquePlayerReference=)[^|]*

然后你可以使用

(?<=videoId=)[^)]*

视频ID