2014-02-20 1 views
1

Я хочу захватить несмежный текст из строки, используя регулярное выражение, и мне очень сложно. (Не могу заставить его работать)Непрерывный текст Захват с регулярными выражениями. Как мне это сделать?

я следующее:

"Джон KC Mary V апельсины."

KC и V - это теги, и они всегда будут существовать в моих строках. В этом случае я хочу захватить «John V апельсины».

Так что я хочу удалить KC и everthing до V (за исключением V).

Я не могу понять, как это сделать. Я делаю это на Java-коде, поэтому я думаю, что у меня есть некоторые синтаксические ограничения для регулярных выражений.

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

Если вы, ребята, можете дать мне несколько идей, я действительно буду aprecciate.

спасибо.

+1

AFAIK невозможно получать не непрерывные части ввода в одном совпадении. Вам нужно будет использовать группы и/или заменить, чтобы достичь того, чего вы хотите. – Nyx

+0

1. Где это в общем тексте, start/middle/end и т. Д.? 2. Вы ищете словосочетания («Jonh», «апельсины») или любые символы, вверх/до/после/перед чем-либо еще? – sln

+0

В большинстве двигателей (не Dot-Net) существует небольшое ограничение на группировку. Информация о массиве Geting для каждого совпадения будет ограничена одним уровнем фиксированной, неквалифицированной скобки. Вы можете сделать (John) KC Mary V (апельсины) ', но если вы сделаете' (? :(John) KC Mary V (апельсины). +?) + 'Группы захвата 1 и 2 будут перезаписаны каждый квантованный проход выражение. Эффективно содержит последние значения, найденные у Джона, апельсинов. – sln

ответ

1

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

([a-zA-Z ]+)KC [a-zA-Z]+ (V [a-zA-Z]+) 

который будет возвращать массив как

Array 
(
    [0] => John KC Mary V oranges. 
    [1] => John 
    [2] => V oranges. 
) 

и вы можете выбрать 2 последних индексов .. Простой ..

+0

Так что невозможно получить его в одном матче? – Roiw

+0

Roiw .. Да. Ваше требование состоит в том, чтобы полностью захватить 2 части строки. теперь, чтобы получить их, вы можете использовать выше обычного выражения .. – Haroon

0

Используйте это регулярное выражение для поиска замены:

KC.*?\s(?=V) 

Это означает, что-либо после KC следуют В. А учитывая, есть пространство перед В.

Выше регулярное выражение, когда вы хотите сделать поиск заменить. Но если вы хотите сделать это с помощью регулярных выражений матча, то регулярное выражение будет:

(.*?)\sKC.+(\sV.*) 

После выполнения матча регулярного выражения, только CONCAT группы 1 и группы 2-возвращенного матча.

+0

Это вернет мне «KC Mary». Что идеально, если я могу использовать String.replace. Но я не могу использовать String.Replace. Мне нужно регулярное выражение, которое вернет меня именно «Джон V апельсины». – Roiw

+0

Отправьте свой код, где вы используете регулярное выражение. Регулярное выражение правильно. Я подозреваю, что вы используете его неправомерно. –

+0

получил. вы не хотите использовать regex-replace, вместо этого вы хотите иметь его как регулярное совпадение. –

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