我收到了文字:
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)我什么时候应该使用括号?
答案 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