Извлечь подстроку из строки с помощью регулярных выражений

2

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

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

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

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

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

Можно ли это сделать с помощью Regex? Спасибо.

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

6 ответов

1
Лучший ответ

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

Пример

User4 -  123456pp12asd         ppsd  

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

Возможно, что-то вроде

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

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

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

Почему вы хотите использовать 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);
  • 0
    Я не объяснил себе. Простите за это. Я хочу иметь все эти шаблоны в таблице, которая относится к конкретному случаю.
  • 0
    Я вполне уверен, что вы могли бы подумать о простом синтаксисе для выражения выше - например, [4,2] и [-3,3] (где - означает «справа»)
Показать ещё 2 комментария
3

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

^...(..)

и

.*(...)$
  • 0
    . * не требуется в вашем регулярном выражении # 2. Необходимо даже взглянуть на что-либо до появления последних трех символов.
  • 0
    Это не нужно, но уменьшает возврат. Теперь он расширяет первое выражение ( .* ) До всей строки, а затем возвращает только три последних символа, чтобы получить соответствие для всего выражения. В противном случае он будет проверять каждый символ, достигнут ли конец.
Показать ещё 1 комментарий
1

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

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

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню