2013-09-20 2 views
1

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

Моя проблема в том, У меня есть следующий набор данных, и я хотел бы избавиться от «Name».

  1. Вопрос пользователя E.g. Вопрос Джона, вопрос Боба
  2. Информация - Название E.g. Информация - Julie, информация - Ричард, информация - Дэвид
  3. Выберите
  4. Отправить

Как мы можем видеть «Имя» только через пару записей, но не в других.

Я создал два регулярных выражения. Я использую одно приложение, которое внутренне использует JAVA для анализа Regex. Я не могу написать свой собственный Java-код, я могу просто предоставить регулярное выражение. :(

  1. (Question*(.*?))
  2. (Information*(.*?))

Проблема я только получаю "Вопрос" запись и система не будет показывать другие три записи.

Я нашел проблема, когда я test regex как (Question*(.*?)), в первом примере он избавляется от «Имени», но тогда он ничего не возвращает в других трех примерах. Я имею в виду, что возврат не заполнен. Поэтому, когда система анализирует «Отправить», при первом преобразовании ' Вопрос 'regex, it не находит слово «Вопрос», поэтому он ничего не возвращает.

То, что я хотел бы иметь, заключается в том, что если «Вопрос» недоступен, система должна возвращать полную строку вместо ее удаления. Итак, когда синтаксический анализ «Отправить» в первом регулярном выражении, он должен возвращать «Отправить» как есть.

Я не знаю, если мое регулярное выражение не является правильным

PS: «Выбрать» и «Отправить» лишь два примера, есть зарегистрирована не менее 20-25 других записи, но есть только две записи, имеющая 'Название' в нем.

+0

Гм. 'if (QUESTION_RE.matches (ввод)) {/ * выполнить замену или извлечение * /} else {return input; } '. Вы * разрешаете использовать код вокруг своих регулярных выражений. (Это может быть не самый изящный способ сделать это с одновременным совпадением одного и того же RE, но он выполнит эту работу.) – millimoose

+0

Я согласен с выше, добавьте в него некоторую логику. – Sinn

+0

Спасибо @millimoose.На самом деле я использую один инструмент, который позволяет мне только ввести Regex. Я не могу написать свой JAVA-код. :(Извините, что я должен был упомянуть в вопросе. – vnkotak

ответ

1

Вы можете использовать регулярное выражение, подобное этому. Поскольку это «или», матч всегда будет явным, чтобы быть MatchGroup 1. (Предполагая, что вы выполняете «одно совпадение в строке»)

. Само Regex будет соответствовать всей строке, но первая Matchgroup будет содержать только ваше ключевое слово.

(?:.*?(Question)|(Information).*?|(Select|Submit)) 

Regular expression visualization

Debuggex Demo

+0

Спасибо @dognose ... По крайней мере, это сработало, объединив два регулярных выражения в один. :) Однако, «Выбрать» и «Выбрать», Submit '- это всего лишь два примера: есть около 20-25 других записей, поэтому вместо того, чтобы использовать' Select 'и' Submit 'специально в regex, можно ли обновить регулярное выражение, чтобы вернуть все остальные записи так, как есть? – vnkotak

+1

Спасибо @dognose ... Это сработало. Я просто заменил «Выбрать» и «Отправить» с помощью (. *), А все остальные с «Вопросом» и «Информация» возвращают полную строку, а для «Вопросов» и «Информация» он удаляет «Имена «... Спасибо за вашу помощь в разрешении и помогая слить два регулярных выражения в один :) – vnkotak

Смежные вопросы