2014-05-08 222 views
0

我使用VB.NET正则表达式对象,并试图以下文本匹配:正则表达式忽略空格

(99- 13014- 0127) 

我所要的输出是:99-13014-0127(无空格和括号)。我也希望匹配的字符串被存储在名为“field”的组中,因为它将被自动提取。问题是我不能从结果中排除空格。从理论上讲,按照MSDN中,非捕获基团“(?:表达)”应适用于我“当量词被施加到一组的非捕获组构建体通常使用的,而是由组捕获的子串是没有兴趣“。但是,我仍然在结果中获得空间。

这里是我使用的模式:

\((?<field>\d{1,6}(?:\s*)-(?:\s*)\d{1,6}(?:\s*)-(?:\s*)\d{1,6})\) 

我得到了上面的文字和图案的结果是:

99- 13014- 0127 

什么是正确的表达式中使用,让我:99-13014-0127没有空格?

感谢

+0

我很欣赏的评论,但我一直在寻找这样做一步到位。我的应用程序的结构方式是,每个字段存储在数据库中的正则表达式模式和VB代码自动调用正则表达式提取过程。我正在寻找一种获取所需字符串而不更改VB代码的方法。它看起来不能完成。 – Ahmad

+0

即使奥利弗的回答需要更换,那么也许你可以使用一个替代,并有另一场在数据库中,以表明空间应该被删除。或者包含要删除的字符的可空字段。 –

回答

0

我建议你这样做:

var newStr = "match".Replace(" ",""); 

这将是一个很好的解决方案,因为它不包含空格和它的工作不使用regex

1

“非捕获组”是指,这个表达式将不会出现在组集合中;但这并不意味着结果将被排除在其他附属组别之外。

相反,使用lookarounds和应用的字符串替换的结果。查找表格查找所需结果模式前后的模式。

string result = Regex.Match(input, @"(?<=\()\d{1,6}s*-\s*\d{1,6}\s*-\s*\d{1,6}(?=\))") 
        .Replace(" ",""); 

正则表达式模式使用图案(?<=prefix)find(?=suffix)其中prefixsuffix和是周边括号\(\)find是用于数的模式。结果中不包括前缀和后缀。因此,不需要将结果捕获到指定的组中。