2009-03-18 3 views
2

Представьте, что пользователи вставляют строки на нескольких компьютерах.Извлечь подстроку из строки с помощью Regex

На одном компьютере шаблон в конфигурации будет извлекать некоторые символы этой строки, скажем, положение с 4 по 5. На другом компьютере шаблон выделения возвращает другие символы, например, последние 3 позиции строки ,

Эти конфигурации (шаблоны регулярных выражений) различны для каждого компьютера и должны быть доступны для изменения администратором без изменения исходного кода.

Некоторые примеры:

  Original_String  Return_Value 
User1 - abcd78defg123   78 
User2 - abcd78defg123   78g1 
User3 - mm127788abcd   12 
User4 - 123456pp12asd   ppsd 

Это может быть сделано с Regex? Спасибо.

+0

Не могли бы вы дать нам несколько других примеров того, что вы пытаетесь сопоставить? Различаются ли длина и формат, или они всегда 4 символа, 2 числа, 4 символа и 3 числа? –

ответ

1

Чтобы иметь регулярные выражения значения захвата для дальнейшего использования вы обычно используете(), в зависимости от регулярного выражения компилятора это может быть() или для майкрософт MSVC Я считаю, что это []

Пример

User4 - 123456pp12asd   ppsd 

наиболее интересен тем, что у вас здесь 2 отдельных участка захвата. Есть ли правило по умолчанию о том, как объединить их вместе, или тогда вы захотите указать, как сделать результат?

Может быть что-то вроде

r/......(..)...(..)/\1\2/ for ppsd 
r/......(..)...(..)/\2-\1/ for sd-pp 

вы хотите запустить регулярное выражение, чтобы получить снимки и обрабатывать их самостоятельно, или вы хотите запускать более продвинутые команды манипуляции?

+0

Это то, что я искал! В C# я не думаю, что вы можете указать, как результат вернется, я могу применить этот шаблон только ... ...... (...) ... (..) $, и в этом случае мне придется обрабатывать каждый матч. Группа [х] сама. Большое спасибо! –

+0

Эй, но если вы знаете способ обработки всех матчей на C#, дайте мне знать! –

7

Почему вы хотите использовать регулярное выражение для этого? Что случилось с:

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); 
+0

Я сам не объяснил. Простите за это. Я хочу иметь все эти шаблоны в таблице, которая относится к конкретному случаю. –

+0

Я вполне уверен, что вы могли бы подумать о простом синтаксисе, чтобы выразить выше - [4,2] и [-3,3] например (где - означает «справа») –

+0

Речь идет о настройке без необходимости перекомпилировать. –

1

Я не уверен, что вы надеетесь получить с помощью RegEx. RegEx используется для сопоставления шаблонов. Если вы хотите извлечь из позиции, просто используйте подстроку.

1

Мне кажется, что Regex на самом деле не является решением здесь. Чтобы вернуть часть строки, начиная с позицией поз (начиная с 0) и длиной длиной, просто вызовите функцию Substring как таковые:

string section = str.Substring(pos, length) 
1

Группировку. Вы можете сопоставитьсь с /^.{3}(.{2})/, а затем посмотреть на группу $ 1, например.

Вопрос в том, почему? Нормальная обработка строк, то есть фактические методы подстроки будут быстрее и понятнее.

3

Если вы действительно хотите использовать регулярные выражения:

^...(..) 

И:

.*(...)$ 
+0

. * Не требуется в вашем регулярном выражении # 2. Нужно даже смотреть на что-либо до трех последних символов. – Tomalak

+0

Это не нужно, но уменьшает откат. Теперь он расширяет первое выражение ('. *') До всей строки, а затем возвращает только последние три символа, чтобы получить соответствие для всего выражения. В противном случае он будет проверять каждый символ, если конец уже достигнут. – Gumbo

+0

Ваш ответ был частью результата, который я хотел бы достичь. Благодарю. –