从String中提取菜单

时间:2015-05-26 06:52:38

标签: c# regex

我希望只要有字符串就从字符串中提取一个菜单。

recipe ABC: Quelle bonne idC)e!
L: 33348, C: 2130

1 Like

2 Comment

3 Next

4 See Comments
# Home

由于我是regex的新手,我尝试了这个:

  If Regex.IsMatch(text, "(\d\w*\n)*") Then

  End If

它返回了真实。

我这样做了吗?

我希望能够在有菜单时提取菜单。菜单没有预先定义的格式。所以我使用了数字为\d的所有字母,后跟字母数字字符\w和新行\n

正则表达式返回true后,如何提取与正则表达式匹配的文本?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

你可以使用一个正则表达式(?sm).*(?=^\d+\s+\p{L}+[\r\n]),它从头开始直到一行(由于^)以一个数字(\d+)开头,然后是一些空格(\s+),然后是一些字母(\p{L}),然后是换行符([\r\n]):

var txt ="Lorem ipsum:amet, consectetur adipiscing elit!!\r\nL: 33348, C: 2130\r\n\r\n1 Next\r\n\r\n2 Forward\r\n\r\n3 Last\r\n\r\n4 See more";
var rx = new Regex(@"(?sm).*?(?=^\d+\s+\p{L}+[\r\n])");
var res = rx.Match(txt).Value;

但是,我相信您的菜单始终以第一行的1开头,并且所有菜单项通常都是大写的。这就是为什么我建议使用another regex来反映以下条件:直到以1开头的行后跟一些空格,然后是大写字母:

var rx = new Regex(@"(?sm).*(?=^1\s+\p{Lu})");

或者,您可以尝试将字符串拆分为行,并检查行是否以1开头。

var out2 = string.Join("\r\n",txt.Split(new string[] { "\r\n" }, StringSplitOptions.None).TakeWhile(p => !p.StartsWith("1 ")).ToList());

结果:

enter image description here enter image description here

答案 1 :(得分:0)

您正在使用isMatch,它只返回信息"模式是否匹配"?

你应该使用这样的东西:

 Regex regex = new Regex(@"(\d\w*\n)*");
    Match match = regex.Match(yourText);
    if (match.Success)
    {
        Console.WriteLine(match.Value);
    }

免责声明:由于您的问题不是关于您的表达本身,我还没有检查它的作用。你还没有就那部分问过帮助,所以我没有给予任何帮助。