我怎么能得到除“(?i)house \ s +(\ d + [ - \ s]?[a-zA-Z]?)\ b”这个?

时间:2013-10-22 14:54:15

标签: .net regex

使用下一个正则表达式,我可以获得地址街的办公室或家庭电话号码:

(?i)house\s+(\d+[-\s]?[a-zA-Z]?)\b 
  

SAINT GEORGE 378部门808房屋3 C和其他地址

结果是“HOUSE 3 C”及其完美。 但现在我需要得到除“HOUSE 3 C”之外的所有内容。 我需要得到,例如:

  

“SAINT GEORGE 378部门808和地址的其余部分”

没有“HOUSE 3 C”

我怎么能得到这个? 谢谢!

1 个答案:

答案 0 :(得分:1)

单个正则表达式匹配必须是连续的;也就是说,它不能排除匹配中间的某些部分文本。但是,您可以简单地执行替换,如下所示:

var input = "SAINT GEORGE 378 DEPARTMENT 808 HOUSE 3 C AND REST OF ADDRESS";
var pattern = @"(?i)house\s+\d+[-\s]?[a-zA-Z]?\b\s*";
var output = Regex.Replace(input, pattern, "");
Console.WriteLine(output); // "SAINT GEORGE 378 DEPARTMENT 808 AND REST OF ADDRESS"

我在模式的末尾添加了\s*以吞噬任何尾随空格。如果没有这个,当我将结果重新加入时,"808""AND"之间会有两个空格。


如果您不想这样做,大多数正则表达式引擎允许您根据找到的匹配项拆分字符串。结果通常是一个数组(或类似数组的结构),包含匹配的字符串部分但不包括匹配本身(除非启用该选项,具体取决于您使用的引擎)。

最简单的解决方案是拆分字符串,然后将结果重新加入。

例如,这将在JavaScript中运行:

var input = "SAINT GEORGE 378 DEPARTMENT 808 HOUSE 3 C AND REST OF ADDRESS";
var output = input.split(/house\s+\d+[-\s]?[a-zA-Z]?\b\s*/i).join("");
console.log(output); // "SAINT GEORGE 378 DEPARTMENT 808 AND REST OF ADDRESS"

这是C#中的一个工作示例:

var input = "SAINT GEORGE 378 DEPARTMENT 808 HOUSE 3 C AND REST OF ADDRESS";
var pattern = @"(?i)house\s+\d+[-\s]?[a-zA-Z]?\b\s*";
var output = string.Join("", Regex.Split(input, pattern));
Console.WriteLine(output); // "SAINT GEORGE 378 DEPARTMENT 808 AND REST OF ADDRESS"

请注意,在这两种情况下,我都删除了该组,因为没有必要,但我也可以使用非捕获组(?…)。在任何一种情况下,这都是必需的,因为在JavaScript和.NET中,如果模式中有捕获组,结果集将包含匹配的组以及围绕整个模式的部分。


如果您不喜欢,可以使用前导和尾随组捕获整个字符串,然后将它们连接在一起:

var input = "SAINT GEORGE 378 DEPARTMENT 808 HOUSE 3 C AND REST OF ADDRESS";
var pattern = @"(.*)(?i)house\s+\d+[-\s]?[a-zA-Z]?\b\s*(.*)";
var match = Regex.Match(input, pattern);
var output = match.Groups[1].Value + match.Groups[2].Value;
Console.WriteLine(output); // "SAINT GEORGE 378 DEPARTMENT 808 AND REST OF ADDRESS"