2009-10-20 56 views
1

即时通讯试图了解正则表达式,以及如何使用它制止索姆日志和填充索姆文本框的结果。一个简单的正则表达式问题

,如果我有一个简单的线条像这样

端口状态:TRO-S-02-AV1 0/23

,并希望把该TRO-S-02-AV1和0/23在一个变量中

所有名字都会在av1上结束,因此定期展开应该基于此。

我在想这样试图让tro-S-02-av1的字符串成为一个文本框的值,但是我无法正确理解它,我该怎么做。

Regex r; 
    Match m; 

    r = new Regex("$`\av1"); 
    m = r.Match("Port status: tro-S-02-av1 0/23"); 

    nodetbx.Text = m.Value; 

回答

2

使用群组进行以下的正则表达式(例如,你也许可以打扫一下)

Port status: (?<ID>[\d\w\-]+)\s(?<ID2>[\s\S]+) 

给你两个命名组,ID1和ID2然后就可以填充。

我发现使用命名组更容易,当第一次学习正则表达式,所以你可以真正看到发生了什么。

看看nregex来帮助练习和测试正则表达式。

regex r = new regex("Port status: (?<ID>[\d\w\-]+)\s(?<ID2>[\s\S]+)"); 
    matchcollection mc = r.matches(MyText); 
    foreach (match m in mc) { 
     string ID1 = m.groups("ID1"); 
     string ID2 = m.groups("ID2"); 
    } 

其中MyText是每行使用ReadLine循环遍历文件或整个文件,如果不是太大。

然后,您可以使用ID1和ID2(重新命名为有意义的内容)来填充文本框或其他内容。

+0

很好的帮助,那个网站看起来不错,但是那条线让我更加困惑,我该如何使用ID和ID2? – Darkmage 2009-10-20 10:59:20

+0

根据您是逐行处理还是作为批处理进行处理,您可以遍历集合中的每个匹配,然后从每个匹配中获取组。 我不做很多C#所以不能写代码完美的我的头顶,但... regex r = new regex(“REGEX”);matchcollection mc = r.matches(MyText); foreach(m中的匹配m){ string ID1 = m.groups(“ID1”); string ID2 = m.groups(“ID2”); } – 2009-10-20 11:07:06

+0

很好的帮助:)谢谢 – Darkmage 2009-10-20 11:08:15

1

对于这个特殊的项目,你可以使用分割字符串的方法

string[] words = s.Split(' '); 

使用ArrayList中的第2个和第3个值。

+0

是的好点,但它只是一个样本最后的日志是数百行大,不同的信息 – Darkmage 2009-10-20 10:46:47

+0

然后它确实没用:) – Rickjaah 2009-10-20 10:47:42

+0

真正的这个例子将分裂字符串,并会打破与上面正则表达式的例子完全一样,它的确取决于你期望看到的可能值的范围 - 空间是否总是在相同的地方等等。 如果格式总是如上,那么保持简单与字符串,如果它会/可能会改变 - 正则表达式可能是你最好的选择。 – 2009-10-20 10:47:46