我非常喜欢正则表达式的新手,我不会过多地使用这种语言。
我试图在此代码中获得competition_id
:
<script type="text/javascript" charset="utf-8">
(function() {
var block = new MatchesBlock('page_team_1_block_team_matches_summary_7', 'block_team_matches_summary', {"page":0,"bookmaker_urls":[],"block_service_id":"team_summary_block_teammatchessummary","team_id":1242,"competition_id":0,"filter":"all","new_design":false});
block.registerForCallbacks();
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_1', 'changeCompetition', {"competition_id":0});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_2', 'changeCompetition', {"competition_id":13});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_3', 'changeCompetition', {"competition_id":135});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_4', 'changeCompetition', {"competition_id":171});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_5', 'changeCompetition', {"competition_id":1148});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_6', 'changeCompetition', {"competition_id":732});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_1_7', 'changeCompetition', {"competition_id":10});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_2_1', 'filterMatches', {"filter":"all"});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_2_2', 'filterMatches', {"filter":"home"});
block.addCallbackObserver('page_team_1_block_team_matches_summary_7_2_3', 'filterMatches', {"filter":"away"});
block.setAttribute('colspan_left', 4);
block.setAttribute('colspan_right', 3);
block.setAttribute('has_previous_page', true);
block.setAttribute('has_next_page', true);
TimestampFormatter.format('page_team_1_block_team_matches_summary_7');
})();
</script>
链接是这样的: 视图源:http://it.soccerway.com/teams/italy/juventus-fc/1242/
到目前为止我做的是:var c = System.Text.RegularExpressions.Regex.Match(data, "'block_team_matches_summary', (\\{.*?\\})\\);\\n",
System.Text.RegularExpressions.RegexOptions.Singleline).Groups[1].Value;
这个正则表达式应该返回所有可用的块,但它只返回第一个元素:
{"page":0,"bookmaker_urls":[],"block_service_id":"team_summary_block_teammatchessummary","team_id":1244,"competition_id":0,"filter":"all","new_design":false}
我需要得到所有的块,我能做什么?
答案 0 :(得分:2)
首先,我建议Expresso。它是免费的,但你必须注册它。我发现它对于使用正则表达式以及学习更好地使用它们都非常有价值。最后一个警告是使用正则表达式进行字符串解析(尤其是网页内容;这就是你的内容),特别容易破解。如果文本有很小的变化,现在可以正常运行的正则表达式很容易就会失败。
有了这个,现在针对您的具体问题。我假设您正在寻找的结果集是0,13,135,171,1148,732,10(所有竞争ID)
我们将首先打开Expresso并将所有文本粘贴到Sample Text(左下角)区域(确保您在Test Mode选项卡上)。现在我们将开始编写正则表达式来查找我们正在寻找的文本。将competition_id":
放入正则表达式区域(左上角)。如果在Regex Analyzer(右上角)中展开树,它将显示每个单独的字符。这表明所有这些字符都将按字面匹配。如果单击“运行匹配”按钮,您将看到“搜索结果”(右下角)中显示的匹配列表。完美,它找到了文本出现的所有8个区域。您可以单击每个搜索结果,Expresso将突出显示示例文本中的相应区域。
现在我们需要扩展它以匹配它之后的数字。如果单击“设计模式”选项卡,您将在底部看到一个区域,其中列出了所有正则表达式符号及其含义。我发现这个区域有助于挖掘各种匹配模式。将正则表达式更改为competition_id":\d+
\d
表示匹配任何数字(0-9),+
表示匹配其中一个或多个。如果单击“运行匹配”,您将看到每个匹配项现在都包含文本competition_id:"<number>
如果我们在C#中使用这个正则表达式,它将返回所有文本,在这种情况下,我们只需要数字。对正则表达式进行最后一次更改competition_id":(\d+)
。请注意,在Regex Analyzer中,它现在表明我们有一个数字捕获组。所有这些意味着括号内部的匹配部分将被放入我们可以轻松提取的自己的组中。单击“运行匹配”,您将注意到匹配项仍包含全文匹配项,但现在每个项下都有一个包含单个值的子组。
现在回到C#,我将假设你在名为data
的字符串值中的那个大脚本块。
string data = ...;
//Get all of the matches
MatchCollection matches = Regex.Matches(data, "competition_id\":(\\d+)");
foreach (Match match in matches)
{
//This is the group number that we saw in expression. Group[0] will be the full match.
Group group = match.Groups[1];
//Get the value out of the group. We can do an int.Parse since we know it will only contian digits
int competition_id = int.Parse(group.Value);
//TODO: Do something with competition_id
}
注意:当它表示为字符串时,我们必须转义正则表达式。
这只是对正则表达式的一个小介绍。我鼓励你玩Expresso并在网上闲逛。那里有很多好的资源。最重要的是练习。
答案 1 :(得分:-1)
"competition_id":(\d+)
应该做的伎俩
检查here
答案 2 :(得分:-1)
以下将删除所有额外字符,例如“{}:
string input = "{\"page\":0,\"bookmaker_urls\":[],\"block_service_id\":\"team_summary_block_teammatchessummary\",\"team_id\":1244,\"competition_id\":0,\"filter\":\"all\",\"new_design\":false}";
input.Replace("{", "");
input.Replace("}", "");
string[] groups = input.Split(new char[] { ',' });
string pattern = "\"(?'name'[^:]+)\":(?'value'.*)";
foreach (string group in groups)
{
string data = group.Replace("\\","");
Match regData = Regex.Match(data, pattern);
Console.WriteLine("name : '{0}', value : '{1}'", regData.Groups["name"].Value, regData.Groups["value"].Value.Replace("\"",""));
答案 3 :(得分:-2)
您需要使用Regex.Matches
代替Regex.Match
。
请参阅以下讨论。 How to find multiple occurrences with regex groups?
要在JavaScript中执行此操作,您可以参考以下讨论。 Javascript regex get an array of all matches, not just the first occurance