我试过\w+\:(\w+\-?\.?(\d+)?)
,但那不对
我有以下案文
<staticText:HelloWorld>_<xmlNode:Node.03>_<date:yyy-MM-dd>_<time:HH-mm-ss-fff>
The end result I want is something like the following
["staticText:HelloWorld", "xmlNode:Node.03","date:yyy-MM-dd","time:HH-mm-ss-fff"]
发布于 2019-05-30 17:40:31
您的模式与示例数据的第3部分和第4部分不匹配,因为在本部分中,\w+\-?\.?(\d+)?
、破折号和数字只匹配一次,不重复。
对于示例数据,您可以使用字符类 [\w.-]+
来匹配冒号后面的部分,以使匹配范围更广一些:
<(\w+\:[\w.-]+)>
或者,为了更具体,可以使用重复模式为Node.03
部件和年份、月份、日期、小时等部件指定一个模式。
<(\w+\:\w+(?:\.\d+|\d+(?:-\d+)+)?)>
解释
<
匹配<
(
捕获组\w+\:\w+
匹配1+单词字符、:
和1+单词字符(?:
非捕获群\.\d+
匹配.
和1+数字|
或\d+(?:-\d+)+
匹配1+数字,重复1+时间匹配-
和1+数字
- `)?` Close non capturing group and make it optional
)
闭捕获群>
发布于 2019-05-30 17:21:31
您可以使用以下正则表达式。
<(.*?)>
然后看一看组是如何检索结果的。
Regex rx = new Regex("<(.*?)>");
string text = "<staticText:HelloWorld>_<xmlNode:Node.03>_<date:yyy-MM-dd>_<time:HH-mm-ss-fff>";
MatchCollection matches = rx.Matches(text);
Console.WriteLine(matches.Count);
foreach(Match match in matches){
var groups = match.Groups;
Console.WriteLine(groups[1]);
}
发布于 2019-05-30 17:22:17
这一行应该能够匹配内容:
<(.*?)>
它会抓住你似乎不想要的箭头,但你可以在没有正则表达式的情况下把它们移除。
你应该考虑一个像https://regexr.com这样的网站--通过允许你粘贴你的案例,看看它是如何与它们一起工作的,它可以成倍地帮助你编写regex。
https://stackoverflow.com/questions/56382683
复制相似问题