C#Regex提取标记之间的多条线

时间:2017-10-05 23:48:58

标签: c# regex

我正在尝试提取Cross Streets~行之后存在的Cross Street值,直到包含某个波浪号字符的下一行 - 在这种情况下,它是一个电话号码,在另一种情况下它可能只是一个波浪号在一条线上本身或其他领域。它全部被拉入包含\r\n个字符的字符串中。字符串的子集如下所示。

\r\nVenue:~SOLDOTNA\r\nCross Streets~\r\nDEAD END / STERLING HWY\r\n S KOBUK ST\r\nPhone:~(999) 999-9999\r\nQuadrant:~ES 1\r\n

我在Visual Studio 2015中使用C#。从以下示例中,我最终希望获得包含"DEAD END / STERLING HWY, S KOBUK ST"

的字符串
Venue:~SOLDOTNA
Cross Streets~
DEAD END / STERLING HWY
 S KOBUK ST
Phone:~(999) 999-9999

我花了好几个小时尝试多个SO建议无济于事。我最近尝试过以下几点:

Regex.Matches(data, "Cross Streets~\r\n(.+?)\r\n.+?~", RegexOptions.Singleline)[0].Groups
{System.Text.RegularExpressions.GroupCollection}
    Count: 2
    IsReadOnly: true
    IsSynchronized: false
    SyncRoot: {Cross Streets~
DEAD END / STERLING HWY
 S KOBUK ST
Phone:~}
    Results View: Expanding the Results View will enumerate the IEnumerable

认为Groups[1]将包含我正在寻找的信息,但它只包含第一行。

Regex.Matches(data, "Cross Streets~\r\n(.+?)\r\n.+?~", RegexOptions.Singleline)[0].Groups[1]
{DEAD END / STERLING HWY}
    Captures: {System.Text.RegularExpressions.CaptureCollection}
    Index: 149
    Length: 23
    Name: "1"
    Success: true
    Value: "DEAD END / STERLING HWY"

虽然与我的环境不一样,但是这里有一个正则表达式链接,请求通过SO wiki正则表达式文章...(它根本不匹配,但在我的C#立即窗口中,我得到如上所示的匹配,只是不完全是我想要的。)

https://regex101.com/r/HpHSra/3

1 个答案:

答案 0 :(得分:0)

你真的不需要正则表达式来做到这一点。您可以使用String.Split方法并搜索所需的结果。

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
    string x = @"Venue:~SOLDOTNA
Cross Streets~
DEAD END / STERLING HWY
 S KOBUK ST
Phone:~(999) 999-9999";


        string[] allResults =   x.Split( new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).ToArray();
        foreach(string y in allResults)
        {
            Console.WriteLine(y + " = " +y.Length);
        }


        Console.WriteLine();


        if(allResults.Contains("Cross Streets~") && allResults.Length >  Array.IndexOf(allResults,"Cross Streets~")+1 )
        {
            Console.WriteLine( "Expeced Result : " +  allResults[ Array.IndexOf(allResults,"Cross Streets~")+1 ]);
        }

    }
}

这是小提琴手:https://dotnetfiddle.net/zvBhMF