1

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

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

圣乔治 378 部门 808 房屋 3 C 和其他地址

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

“圣乔治 378 部门 808 和其他地址”

没有“HOUSE 3 C”

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

4

1 回答 1

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"
于 2013-10-22T14:56:58.923 回答