Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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#和正则表达式:如何提取引号之间的字符串_C#_Regex_Parsing - Fatal编程技术网

C#和正则表达式:如何提取引号之间的字符串

C#和正则表达式:如何提取引号之间的字符串,c#,regex,parsing,C#,Regex,Parsing,假设我有以下字符串: <script language="javascript"> var league = new Array( "Soccer","Germany - 2. Bundesliga","38542195","102","24 May 2009 14:00","24 May 2009 14:00","1X2","1","0" ); var matches = new Array(

假设我有以下字符串:

<script language="javascript"> var league = new Array( "Soccer","Germany - 2. Bundesliga","38542195","102","24 May 2009 14:00","24 May 2009 14:00","1X2","1","0" ); var matches = new Array( "125","1.FC Nurnberg - TSV 1860 Munich","24 May 2009 14:00","Sun, 24.05.09 14:00","1|1.40|4.10|6.40|-","||||","1|1.90|3.50|2.20|0:1","1|1.05|2.20|1.18|-","1|2.00||1.60|2.5","1|3.40|3.20|1.60|2","1|1.70|2.50|5.50|-","||||-","1", "126","FC Ingolstadt 04 - TuS Koblenz","24 May 2009 14:00","Sun, 24.05.09 14:00","1|3.60|2.80|2.00|-","||||","||||:","1|1.68|1.25|1.26|-","1|1.90||1.70|2.5","1|3.10|3.10|1.70|2","1|3.60|2.10|2.45|-","||||-","1", "127","FC St.Pauli 1910 - FSV Frankfurt","24 May 2009 14:00","Sun, 24.05.09 14:00","1|2.50|2.95|2.60|-","||||","||||:","1|1.41|1.44|1.28|-","1|2.00||1.60|2.5","1|3.40|3.20|1.60|2","1|2.95|2.00|3.05|-","||||-","1", "128","MSV Duisburg - VfL Osnabruck","24 May 2009 14:00","Sun, 24.05.09 14:00","1|2.30|3.60|2.40|-","||||","||||:","1|1.35|1.51|1.27|-","1|2.10||1.55|2.5","1|3.60|3.20|1.55|2","||||-","||||-","1", "129","FSV Mainz 05 - SC Rot-Weiss Oberhausen","24 May 2009 14:00","Sun, 24.05.09 14:00","1|1.40|3.80|7.00|-","||||","1|1.95|3.50|2.50|0:1","1|1.05|2.50|1.18|-","1|2.00||1.60|2.5","1|3.40|3.20|1.60|2","1|1.70|2.30|5.50|-","||||-","1", "130","Rot-Weiss Ahlen - SpVgg Greuther Furth","24 May 2009 14:00","Sun, 24.05.09 14:00","1|2.55|3.20|2.55|-","||||","||||:","1|1.42|1.42|1.28|-","1|2.10||1.55|2.5","1|3.60|3.20|1.55|2","1|3.00|2.00|3.00|-","||||-","1", "131","SC Freiburg - 1.FC Kaiserslautern","24 May 2009 14:00","Sun, 24.05.09 14:00","1|1.75|3.25|4.20|-","||||","||||:","1|1.17|1.91|1.24|-","1|2.10||1.55|2.5","1|3.60|3.20|1.55|2","1|2.30|2.10|3.80|-","||||-","1", "132","SV Wehen Wiesbaden - FC Hansa Rostock","24 May 2009 14:00","Sun, 24.05.09 14:00","1|5.00|3.70|1.55|-","||||","||||:","1|2.23|1.09|1.23|-","1|1.90||1.70|2.5","1|3.10|3.10|1.70|2","1|4.50|2.25|2.00|-","||||-","1", "133","TSV Alemannia Aachen - FC Augsburg","24 May 2009 14:00","Sun, 24.05.09 14:00","1|1.60|3.45|5.10|-","||||","||||:","1|1.11|2.13|1.23|-","1|2.10||1.55|2.5","1|3.60|3.20|1.55|2","1|2.10|2.20|4.30|-","||||-","1" ); var events = showLeague(league, matches); hasEvents = hasEvents + events; </script> var-league=新数组( “足球”,“德国-2.德甲”,“38542195”,“102”,“2009年5月24日14:00”,“2009年5月24日14:00”,“1X2”,“1”,“0” ); var matches=新数组( “125”、“1.FC纽伦堡-1.FC纽伦堡-1.FC纽伦堡-TSV 1860-1860慕尼黑”、“2009年5月24日14:00”、“太阳,24.05.05.09 14:00”、“24.40”4.40;4.10 1012444 4 4.10 10124441244|4“1”、“1”、“1”、“1.5”1.4012440 0 0 0 012444 4 4.40;4.40;4.40 4 4 4 4 4.1012444 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4.10;4.101244四四四四四四四四个1012440 0 0 0 012412444 4 4 4 4 4 4 4 4 4 4 4 4 4.10;6.10;6.10;6.101244.10;6.10;6.10;6.1012444“2”,“1 | 1.70 | 2.50 | 5.50 |-”,“1”, “126”126,“财政支持政府支出的财政支出的04—财政财政支出的04—财政支出的04—托托斯科布伦兹的托斯—托托斯—托托斯—托托托斯—托托斯—托托斯—托托斯—托斯—托斯—托斯—托斯—托斯—托斯—托斯—托斯—托斯—托斯,2009年5月24日2009年5月24日14:00”、“太阳,24.05.09.05.09.14.09.09 14.14.09 14:00日14:00日14:00,24:00”、“11243.60-2.6012400 0 0 0-2.60以及2.801244.80124001244.01244.0 01244.0 01240|1244.0 0124;2.00-2.00-2.00-2.00-2.001244.001244.00 2.10 | 2.45 |-“,| | | |-”,“1”, “127”、“FC St.保利1910-FSV-1910-FSV-1910-FSV-法兰克福”、“2009年5月24日14:00”、“太阳,24.05.09 14:00、24.05.14:00”、“太阳,24.5.50-2.5012400-2.50;2.50-2.50;2.60 1240|;2.601245--“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“1-112441241.41.411241.41年1.1.4112441244|;1244|;;;;;;;;;; 1.1.1.44;1.44;1.44;1.44;1.44;1.14;1.14;1.14;1.28;1.28;1.28;1.28;1.28;1.28;1.28;1.28;1.28| 2.00 | 3.05 |-“,| | | |-”,“1”, “128”、“MSV杜伊斯堡-MSV-杜伊斯堡-VfL-VfL-VfL-奥斯纳布克”128”、“MSV-杜伊斯堡-MSV-杜伊斯堡-VfL-VfL-VfL-VfL-奥斯纳布克、MSV-杜伊斯堡-VfL-VfL-奥斯纳布克”、“2009年5月24日14:00”、“太阳,24.05.24.09.14.09 14:00,24.05.09 14:00,24.10.30,3.30日3.301243.30,3.6012440 0 0 0 0 01243.60;2.60;2.601244.401244124;2.40;2.40-----“,“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“1号号号号1124121241212412;2.30;2.30;2|-“,| | |-”,“1”, “129”、“FSV Mainz 5-5-5-5-5-5-5-5-C C C RoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoT05-C C RoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRoRo维维斯O伯豪森”、“2009年5月24.2009 14:00”、“太阳,24.05.14.09 14.09 14 14:14:00,“太阳,24.24.05.14.14.14 14.09 14.14 14 14.14 14 14.14 14 14 14 14:00 00 00,””、“11241.40“11241241.40”1.40”1.40”3.4012400 0 0 0 0 0 0 012412412440 0 012412440 0 012440 0 12440 0 0124412412440 0 3.40;3.40124124|2、“|1.70 | 2.30 | 5.50 |-”、“| | |-”、“1”, “130”130”、“腐败行为是一个不健康的人,而另一个是一个是另一个是另一个2009年5月24日14:00”、“太阳,24.05.09 14:00”、“太阳,24.24.05.14:00”、“太阳,24.05.14.09 14:00,”太阳,24.5.55-3.55,3.20日,2.55-3.20,2.55124551244|;3.20;2.20;2.51244.51245124;2.20;2.55;2.55;2.55;2.55 1245124512451245--------““”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“1”1”112412;2.12;2.12;2.12;2.55.55.5.55.55.5.5.55;2.20;2.55 00 | 2.00 | 3.00 |-”、“| | |-”、“1”, “131”、“SC弗赖堡-1.FC-1.FC凯塞斯莱斯劳恩”、“2009年5月24日14:00”、“太阳,24.05.09 14:00、24.05.14:00”、“1 1.1.751244.75、3.75 3.75、3.25、4.251244.201244.20|4.20124;-“、、、、、、“124\124||||||124堡-1-1-1-2009-2009-2009-2009-2009年5-2009年5-2009年5-2009年5-2009年5-2009年5-4.5-24.5-7,24.5-24.5-24.5-24.7,24.7,24.5-24.7,24.7,24.7-24.7-24.7,24.15,24.7,24.7-24| 2.10 | 3.80 |-“,| | | |-”,“1”, “132”、“SV WehenWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWees巴登——FC-FC-FC-FC-FC-FC-FC-FC-FC-FC-汉萨-FC-汉萨-FC-FC-FC-FC-FC-汉萨罗斯托克”、“2009年5 5月24:00”、“太阳,24.05.09.24.09.09.09.14 14 14.09 14 14 14:00 14 14:14:00,14:00,14:00,太阳,24.00,24.05.09 14.09 14:00,14:00,14:00,“1.00”、“1.00”1.00、1.0 0 0 0 0 0 0 0 0 0 0.00,3.00,3.001244.00,3.00,3.00,3.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 2.25 | 2.00 |-“,| | | |-”,“1”, “133”、“TSV-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-C-C-A-C-A-C-C-A-C-A-A-A-A-A-A-A-C-A-A-C-A-A-A-A-A-A-C-A-A-A-A-C-A-C-A-A-C-C-A-C-A-C-C-A-C-A-C-C-A-A-A-C-C-A-A-A-C-A-C-C-A-C-C-C-C-B-B-B-B-C-B-B-B-B;2.20 | 4.30 |-”、“| | |-”、“1” ); var事件=表演联赛(联赛,比赛); hasEvents=hasEvents+事件; 我要做的是解析读取“var matches”的部分,并提取两个引号之间包含的任何内容。因此,所需结果应为包含以下内容的数组:

(0): 125 (1): 1.FC Nurnberg - TSV 1860 Munich (2): 24 May 2009 14:00 etc. (0): 125 (1) :1.FC纽伦堡-TSV 1860慕尼黑 (2) :2009年5月24日14:00 等
NB:我看到一个类似的问题得到了回答,但花了一段时间后,我没能让它起作用。谢谢

我认为您需要删除开头和结尾的“并按 “,”

请尝试以下操作:

using System.Text.RegularExpressions;

public static MatchCollection getMatches(String input, String pattern) {
   Regex re = new Regex(pattern);
   return re.Matches(input);
}

public static void Example() {
   String pattern1 = "var matches = new Array\\(([^\\)]+)\\)";

   MatchCollection results = getMatches(RandomTest, pattern1);
   String marray = results[0].Groups[1].Value;

   String pattern2 = "\"([^\"]+)\"";
   List<String> values = new List<String>();
   foreach (Match value in getMatches(marray,pattern2)) {
      //Your values are in the Groups property
      values.Add(value.Groups[1].Value);
      Console.WriteLine(value.Groups[1].Value);
   }
}
使用System.Text.regular表达式;
公共静态MatchCollection getMatches(字符串输入,字符串模式){
正则表达式re=新正则表达式(模式);
返回重新匹配(输入);
}
公共静态void示例(){
String pattern1=“var matches=new Array\\([^\\)]+)\\”;
MatchCollection结果=getMatches(随机测试,模式1);
字符串marray=results[0]。组[1]。值;
字符串模式2=“\”([^\“]+)\”;
列表值=新列表();
foreach(getMatches中的匹配值(marray,pattern2)){
//您的值位于“组”属性中
values.Add(value.Groups[1].value);
Console.WriteLine(value.Groups[1].value);
}
}

第一种模式提取匹配数组,第二种模式获取该数组中的所有带引号的值。请不要为此使用正则表达式,CSV应由解析器处理。使用正则表达式执行此操作是所有方法中最慢、最容易出错的方法

下面是一个随时可用的解析器:。其他的例子很容易找到,因为实现CSV解析器是一种流行的做法

您还可以使用OLEDB内置解析器:


在您的示例中,我将使用
IndexOf()
“var matches=new Array(“
”);“
之间剪切字符串,并将结果视为CSV字符串。

我将使用以下正则表达式模式匹配整个数组内容:

"var matches = new Array\(\s+(.*?)\s+\)"

。。。然后在逗号分隔符上执行String.Split。

如果确实要使用正则表达式,请尝试以下操作:

var matches = new Array\(\s*("(?:[^\\"]*|\\.)*"\s*(?:,\s*"(?:[^\\"]*|\\.)*")*)\s*\);
这将得到数组值列表。然后,另一个正则表达式可以获得单个值:

"(?:[^\\"]*|\\.)*"

但是,在这种情况下使用正则表达式并没有那么有效。一个简单的CSV解析器会更好。

如果您需要所有行的单一列表,请使用以下命令:

/// <returns>Returns all values inside matches array in a single list</returns>
        public static List<string> GetMatchesArray(String inputString)
        {
            // Matches var matches = new Array( ... );
            Regex r = new Regex("(var matches = new Array\\([^\\)]*\\);)",
                RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);

            string arrayString = r.Match(inputString).Groups[0].Value;

            List<string> quotedList = new List<string>();

            // Matches all the data between the quotes inside var matches
            r = new Regex("\"([^\"]+)\"", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
            for (Match m = r.Match(arrayString); m.Success; m = m.NextMatch())
            {
                quotedList.Add(m.Groups[1].Value);
            }

            return quotedList;
        }
///返回单个列表中匹配数组内的所有值
公共静态列表GetMatchesArray(字符串输入字符串)
{
//Matches var Matches=新数组(…);
Regex r=new Regex(((var matches=new Array\\([^\\)]*\\);)”,
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
字符串arrayString=r.Match(inputString).Groups[0]。值;
List quotedList=新列表();
//匹配var Matches中引号之间的所有数据
r=新正则表达式(“\”([^\“]+)\”,RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
for(匹配m=r.Match(arrayString);m.Success;m=m.NextMatch())
{
quotedList.Add(m.Groups[1].Value);
}
返回报价单;
}
如果你想每行有一个单独的列表,你应该有一个行列表,在每个列表中你应该有一个引用文本列表。下面的代码可以做到这一点:

/// This will help you store the data in a list in a more meaningful way, 
/// so that you are able to organize the data per line
/// Returns all the quoted text per line in a list of lines
public static List<List<string>> GetMatchesArrayPerLine(String inputString)
{
    // Matches var matches = new Array( ... )
    Regex r = new Regex("(var matches = new Array\\([^\\)]*\\);)",
        RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);

    string arrayString = r.Match(inputString).Groups[0].Value;

    List<string> lineList = new List<string>();

    // Matches all the lines and stores them in lineList one line per item. For e.g.
    // "125","1.FC Nurnberg - TSV 1860 Munich", ...
    // "126","FC Ingolstadt 04 - TuS Koblenz", ...
    r = new Regex("\n(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
    for (Match m = r.Match(arrayString); m.Success; m = m.NextMatch())
    {
        lineList.Add(m.Groups[1].Value);
    }

    List<List<string>> quotedListPerLine = new List<List<string>>();

    // Matches the quoted text per line. 
    // This will help you store data in an organised way rather than just a list of values
    // Similar to a 2D array
    // quotedListPerLine[0] = List<string> containing { "125", "1.FC Nurnberg - TSV 1860 Munich", ... }
    // quotedListPerLine[1] = List<string> containing { "126","FC Ingolstadt 04 - TuS Koblenz", ... }
    r = new Regex("\"([^\"]+)\"", RegexOptions.IgnoreCase | RegexOptions.Compiled);
    foreach (string line in lineList)
    {
        List<string> quotedList = new List<string>();
        for (Match m = r.Match(line); m.Success; m = m.NextMatch())
        {
            quotedList.Add(m.Groups[1].Value);
        }
        quotedListPerLine.Add(quotedList);
    }

    return quotedListPerLine;
}
///这将帮助您以更有意义的方式将数据存储在列表中,
///这样您就能够组织每行的数据
/
/// This will help you store the data in a list in a more meaningful way, 
/// so that you are able to organize the data per line
/// Returns all the quoted text per line in a list of lines
public static List<List<string>> GetMatchesArrayPerLine(String inputString)
{
    // Matches var matches = new Array( ... )
    Regex r = new Regex("(var matches = new Array\\([^\\)]*\\);)",
        RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);

    string arrayString = r.Match(inputString).Groups[0].Value;

    List<string> lineList = new List<string>();

    // Matches all the lines and stores them in lineList one line per item. For e.g.
    // "125","1.FC Nurnberg - TSV 1860 Munich", ...
    // "126","FC Ingolstadt 04 - TuS Koblenz", ...
    r = new Regex("\n(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
    for (Match m = r.Match(arrayString); m.Success; m = m.NextMatch())
    {
        lineList.Add(m.Groups[1].Value);
    }

    List<List<string>> quotedListPerLine = new List<List<string>>();

    // Matches the quoted text per line. 
    // This will help you store data in an organised way rather than just a list of values
    // Similar to a 2D array
    // quotedListPerLine[0] = List<string> containing { "125", "1.FC Nurnberg - TSV 1860 Munich", ... }
    // quotedListPerLine[1] = List<string> containing { "126","FC Ingolstadt 04 - TuS Koblenz", ... }
    r = new Regex("\"([^\"]+)\"", RegexOptions.IgnoreCase | RegexOptions.Compiled);
    foreach (string line in lineList)
    {
        List<string> quotedList = new List<string>();
        for (Match m = r.Match(line); m.Success; m = m.NextMatch())
        {
            quotedList.Add(m.Groups[1].Value);
        }
        quotedListPerLine.Add(quotedList);
    }

    return quotedListPerLine;
}
List<List<string>> quotedListLines = MyRegEx.GetMatchesArrayPerLine(a);
foreach (List<string> line in quotedListLines)
{
    Console.WriteLine("----LINE---");
    foreach (string quotedText in line)
        Console.WriteLine(quotedText);
}