一致結果のリストを正規表現からList<string>
に変換するにはどうすればよいですか?この機能はありますが、常に例外が生成されます。
タイプ 'System.Text.RegularExpressions.Match'のオブジェクトをタイプ 'System.Text.RegularExpressions.CaptureCollection'にキャストできません。
public static List<string> ExtractMatch(string content, string pattern)
{
List<string> _returnValue = new List<string>();
Match _matchList = Regex.Match(content, pattern);
while (_matchList.Success)
{
foreach (Group _group in _matchList.Groups)
{
foreach (CaptureCollection _captures in _group.Captures) // error
{
foreach (Capture _cap in _captures)
{
_returnValue.Add(_cap.ToString());
}
}
}
}
return _returnValue;
}
この文字列がある場合、
I have a dog and a cat.
正規表現
dog|cat
関数がList<string>
に結果を返すようにしたい
dog
cat
正規表現では、Regex.Matches
を使用して、必要な文字列の最終リストを取得する必要があります。
MatchCollection matchList = Regex.Matches(Content, Pattern);
var list = matchList.Cast<Match>().Select(match => match.Value).ToList();
正規表現一致によるループ -からのクロスポスト回答
正規表現の一致リストのみを取得するには、次の方法があります。
var lookfor = @"something (with) multiple (pattern) (groups)";
var found = Regex.Matches(source, lookfor, regexoptions);
var captured = found
// linq-ify into list
.Cast<Match>()
// flatten to single list
.SelectMany(o =>
// linq-ify
o.Groups.Cast<Capture>()
// don't need the pattern
.Skip(1)
// select what you wanted
.Select(c => c.Value));
これにより、キャプチャされたすべての値が単一のリストに「フラット化」されます。キャプチャグループを維持するには、Select
ではなくSelectMany
を使用してリストのリストを取得します。
Linqを使用した可能なソリューション:
using System.Linq;
using System.Text.RegularExpressions;
static class Program {
static void Main(string[] aargs) {
string value = "I have a dog and a cat.";
Regex regex = new Regex("dog|cat");
var matchesList = (from Match m in regex.Matches(value) select m.Value).ToList();
}
}
コードにうまく適合する別のソリューションを次に示します。
while (_matchList.Success)
{
_returnValue.Add(_matchList.Value);
_matchList = _matchList.NextMatch();
}