2012-04-29 2 views
2

Есть ли способ в C# использовать регулярное выражение, но возвращать (с регулярным выражением Regex.Match) часть Regex? Например,"скрытый" 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) где a и b регулярные выражения соответствует a только если за ней следует b но не соответствует b.

+0

спасибо, это именно тот тип «скрытого» регулярных выражений, я искал:) – MatthewSot

0

Вы можете использовать «группы» для захвата определенной части строки. Например, предположим, что вы хотели захватить имя в Hello, John!. Наш Regex будет выглядеть примерно так:

/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

Я думаю, что вы ищете захвата групп в Regex. Вы можете идентифицировать группу захвата, используя скобки. В вашем конкретном примере:

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)"