單個正則表達式匹配必須是連續的;也就是說,它不能排除比賽中的某段文字。但是,你可以簡單地進行更換,這樣的:
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"
謝謝您的回答。你可能是特異的嗎?我所做的就是你所說的。在地址字段中使用正則表達式拆分。但在此之後,我必須提取所有不包含其餘字段中包含其餘地址不相關字段的字段。但我不知道如何得到這個。 – Patricio
@Patricio如果沒有看到代碼,我無法做很多工作來確定代碼有什麼問題。請顯示您的代碼並指定您正在使用的正則表達式引擎。 –
我用我的正則表達式使用.net,但它的結果與http://regex101.com/相同。那麼在regex101中有什麼工作對我來說很好。這個想法是獲得(?i)house \ s +(\ d + [ - \ s]?[a-zA-Z]?)\ b的選擇。謝謝! – Patricio