2012-08-19 83 views
2

在C#中,我构建了一个地址解析器。假设我有地址:正则表达式分割为最小长度

Av. Rouxinol 101 - São Paulo - Brasil - CEP 04516-001 - Fone + 55 11 2151

我想将字符串分割成单独的线。期望的结果是:

  1. Av. Rouxinol 101
  2. São Paulo Brasil
  3. CEP 04516-001
  4. Fone + 55 11 2151

的开裂-会给我5号线;它也将拆分CEP(巴西邮政编码)。

所以,我想要实现的逻辑是每个部分至少应该有6个字符长,所以我想我必须使用lookbehind/forward?

到目前为止,我有:

(?<=.{6})-(?=.{6}) 

回答

0

使用正则表达式(?:^|(?<=\s-\s)).*?(?:(?=\s-\s[^-]{8,})|$)

using System; 
using System.Text.RegularExpressions; 

public class Test 
{ 
    public static void Main() 
    { 
    string input = "Av. Rouxinol 101 - Sao Paulo - Brasil - CEP 04516-001 - Fone + 55 11 2151"; 
    Regex re = new Regex(@"(?:^|(?<=\s-\s)).*?(?:(?=\s-\s[^-]{8,})|$)", RegexOptions.Singleline); 
    MatchCollection matches = re.Matches(input); 
    foreach (Match m in matches) { 
     Console.WriteLine(m); 
    } 
    } 
} 

测试此代码here

输出:

Av. Rouxinol 101 
Sao Paulo - Brasil 
CEP 04516-001 
Fone + 55 11 2151 
+0

很酷!感谢名单! – Tuol 2012-08-27 13:49:52

2

你可以只在␣-␣分裂(空格上划线的两侧)。这将确保地址中的连字符不会分开。

+0

谢谢Kolink!虽然这可以在这个例子中起作用,但是提供的输入是来自多个元素的复制粘贴地址,所以提供的输入很可能不包含空格。在一个理想的世界里,这个模式占了最小的部分长度。 – Tuol 2012-08-23 18:32:58