Представьте, что пользователи вставляют строки на нескольких компьютерах.
На одном компьютере шаблон в конфигурации будет извлекать некоторые символы этой строки, скажем, положение 4-5. На другом компьютере шаблон extract вернет другие символы, например, последние 3 позиции строки.
Эти конфигурации (шаблоны Regex) различаются для каждого компьютера и должны быть доступны для изменения администратором без изменения исходного кода.
Некоторые примеры:
Original_String Return_Value
User1 - abcd78defg123 78
User2 - abcd78defg123 78g1
User3 - mm127788abcd 12
User4 - 123456pp12asd ppsd
Можно ли это сделать с помощью Regex? Спасибо.
Чтобы иметь значения захвата регулярных выражений для дальнейшего использования, вы обычно используете(), в зависимости от компилятора регулярного выражения, которое может быть() или для Microsoft MSVC. Я думаю, что это []
Пример
User4 - 123456pp12asd ppsd
наиболее интересен тем, что у вас здесь две отдельные области захвата. Есть ли правило по умолчанию о том, как объединить их вместе, или тогда вы захотите указать, как сделать результат?
Возможно, что-то вроде
r/......(..)...(..)/\1\2/ for ppsd
r/......(..)...(..)/\2-\1/ for sd-pp
Вы хотите запустить регулярное выражение, чтобы получить захваты и обрабатывать их самостоятельно, или вы хотите запускать более сложные команды управления?
Почему вы хотите использовать regex для этого? Что не так:
string foo = s.Substring(4,2);
string bar = s.Substring(s.Length-3,3);
(вы можете обернуть их, чтобы сделать немного ограничений - проверка на длину достаточно легко)
Если вы действительно этого хотите, вы можете обернуть его в Func<string,string>
, чтобы положить куда-нибудь - не уверен, что я беспокоюсь, хотя:
Func<string, string> get4and5 = s => s.Substring(4, 2);
Func<string,string> getLast3 = s => s.Substring(s.Length - 3, 3);
string value = "abcd78defg123";
string foo = getLast3(value);
string bar = get4and5(value);
Если вы действительно хотите использовать регулярное выражение:
^...(..)
и
.*(...)$
.*
) До всей строки, а затем возвращает только три последних символа, чтобы получить соответствие для всего выражения. В противном случае он будет проверять каждый символ, достигнут ли конец.
Мне кажется, что Regex действительно не является решением здесь. Чтобы вернуть раздел строки, начинающейся в позиции pos (начиная с 0) и длины длины, вы просто вызываете функцию Substring как таковую:
string section = str.Substring(pos, length)
Группировка. Вы можете сопоставитьсь с /^.{3}(.{2})/, а затем посмотреть на группу $1, например.
Вопрос в том, почему? Нормальная обработка строк, то есть фактические методы подстроки будут более быстрыми и ясными в намерениях.
Я не уверен, что вы надеетесь получить с помощью RegEx. RegEx используется для сопоставления шаблонов. Если вы хотите извлечь из позиции, просто используйте подстроку.