Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式有问题,在特殊字符出现之前,如何使用\S获取所有内容?_C#_Asp.net_Regex - Fatal编程技术网

C# 正则表达式有问题,在特殊字符出现之前,如何使用\S获取所有内容?

C# 正则表达式有问题,在特殊字符出现之前,如何使用\S获取所有内容?,c#,asp.net,regex,C#,Asp.net,Regex,我收到了文本: 192.168.20.31 Url=/flash/56553550_hi.mp4?token=(uniquePlayerReference=81781956||videoId=1) 我正试图获得uniquePlayerReference和videoId 我试过这个正则表达式: (?<=uniquePlayerReference=)\S* 然后我试着用这个来获取视频id: (?<=videoId=)\S* (?鉴于两个id都是数字,您最好使用\d而不是\s\d只

我收到了文本:

192.168.20.31 Url=/flash/56553550_hi.mp4?token=(uniquePlayerReference=81781956||videoId=1) 
我正试图获得uniquePlayerReference和videoId

我试过这个正则表达式:

(?<=uniquePlayerReference=)\S*
然后我试着用这个来获取视频id:

(?<=videoId=)\S*

(?鉴于两个id都是数字,您最好使用
\d
而不是
\s
\d
只匹配数字,而
\s
匹配任何非空白字符

您还可以进行非格雷迪匹配,直到您不想匹配的角色,如下所示:

uniquePlayerReference=(.*?)\|\|videoId=(.*?)\)
请注意,我对
|
字符都进行了转义,因为否则它们在正则表达式中会有特殊的含义

在C#中,您可以这样使用:(这也回答了您的问题,括号是用来表示什么的,它们是用来表示匹配结果的一部分)


鉴于两个id都是数字,您最好使用
\d
而不是
\s
<代码>\d
仅匹配数字,而
\S
匹配任何非空白字符

您还可以进行非格雷迪匹配,直到您不想匹配的角色,如下所示:

uniquePlayerReference=(.*?)\|\|videoId=(.*?)\)
请注意,我对
|
字符都进行了转义,因为否则它们在正则表达式中会有特殊的含义

在C#中,您可以这样使用:(这也回答了您的问题,括号是用来表示什么的,它们是用来表示匹配结果的一部分)


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

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

我想你想要这样的东西:

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

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

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

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

我想你想要这样的东西:

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

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

S表示它匹配任何非空白字符,包括右括号。因此,如果必须使用\S,则必须在右括号处显式地说stop,如下所示:

/uniquePlayerReference=(\d+)||videoId=(\d+)/i
videoId=(\S+)\)
因此,最好使用\d,因为您要查找的是数字:

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

\S表示它匹配任何非空白字符,包括右括号。因此,如果必须使用\S,则必须在右括号处显式地说stop,如下所示:

/uniquePlayerReference=(\d+)||videoId=(\d+)/i
videoId=(\S+)\)
因此,最好使用\d,因为您要查找的是数字:

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

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

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

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

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

(?这是一个很好的回答,也很有效,但是在我追求精通的过程中,任何人都能找到一个与| |相匹配的解决方案吗?不管这些值是什么?(当然,除非有一个双重教皇):-)这将不起作用,
*
是贪婪匹配,将非常愉快地读取字符串的其余部分。您需要将
*
替换为
*?
以使其不贪婪,然后在遇到下一个字符时停止,
(不需要转义)@Lazarus:你说得对。我很快就编辑了我的解决方案。我把它改回了以前的样子。不,留下你的解决方案……编辑它;)这仍然是个好答案。@Lazarus:根据你的建议更改了我的解决方案:-)这是一个很好的回答,很有效,然而,在我寻求精通的过程中,任何人都能找到一个与| | |匹配的解决方案,无论其值是什么?(当然,除非里面有一个双教皇):-)这行不通,
*
是一个贪婪的匹配,它会非常愉快地读取字符串的其余部分。您需要将
*
替换为
*?
以使其不贪婪,然后当它遇到下一个字符
|
(不需要转义)时,它将停止。@Lazarus:您是对的。我的解决方案编辑得太快了。我把它改回原来的样子了。不,留下你的解决方案。。。只需编辑它;)这仍然是一个很好的答案。@Lazarus:根据你的建议更改了我的解决方案:-)这是一个非常好的回答,我知道你做了什么,它说匹配任意数量的字符直到它不匹配的地方=|,天才@与其说是天才,不如说是没有完整规格的合理解决方案。如果ID总是数字,那么@annakata下面的解决方案就更优雅了。哈哈,好吧,伙计,它们并不总是数字,所以在这种情况下,我会使用你的答案,尽管我已经将它们标记为有用的,因为它们都教给了我一些我不知道的东西!这是一个非常好的回答,我知道你做了什么,它说匹配任意数量的字符直到它不匹配的地方=|,天才@与其说是天才,不如说是没有完整规格的合理解决方案。如果ID总是数字,那么@annakata下面的解决方案就更优雅了。哈哈,好吧,伙计,它们并不总是数字,所以在这种情况下,我会使用你的答案,尽管我已经将它们标记为有用的,因为它们都教给了我一些我不知道的东西!