Если у вас есть несколько подстанций строки, которые вам нужны внутри большей строки, вы можете использовать группы захвата.
Чтобы получить per
часть, используйте следующее регулярное выражение и захватить Groups[2].Value
:
var str = "my text has $1 per Lap to someone. ";
var per_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[2].Value;
Выход:
Регулярное выражение для захвата per
является \p{L}+
где \p{L}
захватывает все буквы Unicode (например, ф
, ё
), а не только латинский алфавит.
Чтобы получить номер детали, использовать тот же регулярное выражение, но захватить Groups[1].Value
:
var num_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[1].Value;
Выход:
И еще один совет: скомпилировать регулярное выражение первым, если вы планируете использовать его несколько раз во время выполнения вашего приложения:
var rx = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)", RegexOptions.Compiled);
var per_str = rx.Match(str).Groups[2].Value;
var num_str = rx.Match(str).Groups[1].Value;
В случае, если вам нужно только число после $
, просто положите круглый кронштейн после него в регулярное выражение: @"\$(\d+(?:\.\d+)?)\s*(\p{L}+)"
.
И получить все группы в 1 ход, вы можете использовать
var groups = rx.Matches(str).Cast<Match>().Select(p => new { num = p.Groups[1].Value, per = p.Groups[2].Value }).ToList();
EDIT:
Если вы просто хотите, чтобы соответствовать per
после номера, вы можете использовать @"(\$\d+(?:\.\d+)?)\s*(per)"
или (без учета регистра) @"(\$\d+(?:\.\d+)?)\s*((?i:per\b))"
Чтобы уточнить: вы хотите, чтобы соответствовать '' $, число, 'per', и слово; фиксируя число и слово? – Richard
Какой тип 'per'? – Kasramvd
@ Kasra это просто тип строки. – Sampath