我希望只要有字符串就从字符串中提取一个菜单。
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后,如何提取与正则表达式匹配的文本?
任何帮助都将不胜感激。
答案 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());
结果:
答案 1 :(得分:0)
您正在使用isMatch
,它只返回信息"模式是否匹配"?
你应该使用这样的东西:
Regex regex = new Regex(@"(\d\w*\n)*");
Match match = regex.Match(yourText);
if (match.Success)
{
Console.WriteLine(match.Value);
}
免责声明:由于您的问题不是关于您的表达本身,我还没有检查它的作用。你还没有就那部分问过帮助,所以我没有给予任何帮助。