2016-08-01 3 views
2

У меня есть следующие данные:номер захвата между двумя пробелами (RegEx)

SOMEDATA .test 01/45/12 2.50 THIS IS DATA 

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

(?<=\d{2}\/\d{2}\/\d{2})\d+.\d+ 

Однако это не работает для ввода, как это:

SOMEDATA .test 01/45/12 2500 THIS IS DATA 

В этом случае, я хочу, чтобы извлечь номер 2500.

Я не могу представить правило регулярного выражения для этого. Есть ли способ извлечь что-то между двумя пробелами? Итак, извлеките текст/число после даты до следующего пробела? Все, что я знаю, это то, что дата всегда будет иметь тот же формат, и после текста всегда будет пробел, а затем пробел после числа, которое я хочу извлечь.

Может кто-нибудь помочь мне в этом?

+0

Есть ли у вашей линии текст «ЭТО ДАННЫЕ»? –

+0

@SebastianProske, который отлично работает. Спасибо. Можете ли вы объяснить, что вы там делаете с помощью \ d + (. \ D +)? – user2606751

+0

@ user2606751: Посмотрите мой комментарий к текущему ответу. Главное, что ваше регулярное выражение не является «правильным», поскольку точка не отображается. Вы должны использовать его так, как показывает Дмитрий, иначе вы не сможете сопоставить однозначные значения, например 'SOMEDATA .test 01/45/12 2 ДАННЫЕ ДАННЫЕ'. –

ответ

2

номер Захват между двумя пробелами

пробелами сочетается с \s и непробельных с \S.

Итак, что вы можете использовать это:

\d{2}\/\d{2}\/\d{2} +(\S+) 
         ^^^ 

Смотрите regex demo

1+ непробельных символы захватываются в 1-й группе.

Если - по какой-то причине - вам нужно только получить значение в качестве всего матча, используйте назад 'подход:

(?<=\d{2}\/\d{2}\/\d{2})\S+ 

Или - если вы используете PCRE - вы можете использовать оператор сброса матч \K :

\d{2}\/\d{2}\/\d{2} +\K\S+ 
        ^^ 

См another demo

ПРИМЕЧАНИЕ: \K и подходы группы захвата позволяют сделать 1 или более пробелов после даты и, таким образом, более гибкими.

1

Просто сделать фрактал часть дополнительно:

(?<=\d{2}\/\d{2}\/\d{2})\d+(?:\.\d+)? 

Демо: https://regex101.com/r/jH3pU7/1

Update следующие пояснения в комментариях:

Чтобы соответствовать ничего (кроме пространства), окруженный пробелами и вставляться перед путем использование даты:

(?<=\d{2}\/\d{2}\/\d{2})\S+ 

Demo:. https://regex101.com/r/jH3pU7/3

+1

Главное, что OP имеет unescaped '.', который соответствует любому символу, но новой строке. Нет необходимости использовать эту необязательную группу, если ['(? <= \ D {2} \/\ d {2} \/\ d {2}) \ d +. \ D +'] (https://regex101.com/ r/jH3pU7/2). Тем не менее, конечно, точка должна быть экранирована и используется дополнительная группа. :) –

+0

@ WiktorStribiżew можно найти решение, которое извлекает все после даты до следующего пробела? независимо от того, что находится в текстовой точке или запятой или что-то еще? – user2606751

+1

Конечно, используйте ['\ S +'] (https://regex101.com/r/xG5xS1/1). –

1

Я вижу, что некоторые люди помогли вам уже, но если вы хотите альтернативу рабочий один по какой-то причине, вот что тоже работает :)

.+ \d+\/\d+\/\d+ (\d+[\.\d]*) 

Так + соответствует любому плюс первое пространство , тогда \ d +/\ d +/\ d + - это синтаксический анализ даты плюс пробел группа захвата - это номер, так как вы можете видеть, что я сделал последнюю часть опциональной, так что значения с плавающей запятой и нормальные значения могут быть соответствует. Надеюсь, это помогло!

Доказательство: https://regex101.com/r/fY3nJ2/1

1

Вместо захвата, вы можете сделать ваш весь матч быть целевым текстом, используя вид сзади:

(?<=\d\d(\/\d\d){2})\S+ 

Это соответствует первой серии непробельных, который следует за «дату, как» часть.

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

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