2012-04-29 45 views
2

C#中是否有任何方式使用正則表達式,但只返回(與Regex.Match)正則表達式的一部分?例如,「隱藏」RegEx?

string input = "Hello my friend!"; 
string pattern = "\\w+ my friend."; 
Console.WriteLine(Regex.Match(input, pattern)); //Returns "Hello my friend!" 

但如果我只是想「你好」,或者只是在末標點?我知道我可以做類似「^\\w+」(甚至只是.split(' ')[0]),但隨後會匹配任何輸入的第一個字,我只希望它,如果它的其餘部分與匹配的第一個字匹配「my friend.」有沒有辦法做到這一點,還是會比較簡單只是做

string input = "Hello my friend!"; 
string pattern = "\\w+ my friend."; 
if (Regex.IsMatch(input, pattern)) 
{ 
    Console.WriteLine(input.Split(' ')[0]); 
} 
else 
{ 
    Console.WriteLine(""); 
} 

(對不起,如果這是非常簡單的,或者如果我失去了一些東西,我剛開始真的很喜歡使用Regexs)

謝謝,

馬修

回答

1

除了在其他答案中建議的捕獲組之外,您還可以使用超前功能。因此,您可以使用類似"\\w+(?= my friend)"的表達式,整個比賽只會返回\\w+部分。

在一般情況下,在形式的模式a(?=b)其中ab是正則表達式匹配a只有在後面b但不匹配b

+0

感謝,這正是「潛伏」正則表達式我一直在尋找的類型: ) – MatthewSot

0

您可以使用「組」來捕獲字符串的特定部分。例如,假設您想要在Hello, John!中捕獲該名稱。我們的正則表達式將類似於此:

/Hello, (.+)/ 

()(組)操作中捕捉任何東西。然後我們可以使用下面的代碼來獲取名稱。

var regex = new Regex(@"Hello, (.+)"); 
var match = regex.Match("Hello, John"); 

System.Console.WriteLine("Your name is {0}.", match.Groups[1]); // Your name is John. 
0

我認爲你正在尋找捕獲組內正則表達式。您可以使用圓括號識別一個捕獲組。對於您的特定示例:

string input = "Hello my friend!"; 
string pattern = "(\\w+) my friend"; 
var match = Regex.Match(input, pattern); 
Console.WriteLine(match.Groups[1]); // Prints "Hello" 
0

或者你可以用一個超前做(未經測試,因爲我沒有任何辦法來測試C#)

"\\w+(?=\\s+my friend)"