2014-10-19 3 views
-1

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

ALEXANDRITE OVAL 5.1x7.9 GIA# 6167482443 FINE w:1.16 
ALEXANDRITE OVAL 4x6 FINE w:1.16 

Я хочу, чтобы соответствовать 5.1 и 7.9, а также 4 и 6, а не вес: 1,16 или вес: 1,16 или 6167482443. До сих пор я удалось придумать с этим:

Совпадение Вт: 1,16 Вт: 1,16

([w][:]\d\.?\d*|[w][:]\s?\d\.?\d*) 

Matching другие цифры:

\d+\.?\d{,3} 

Я вроде ожидал, что это не возвращение длинной последовательности чисел из-за {, 3}, но она все еще делает.

Мои вопросы: 1. Как объединить два шаблона, исключая один, и вернуть другой? 2. Как исключить длинную последовательность чисел? Почему он не исключается сейчас?

Спасибо!

ответ

2

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

\b(\d+(?:\.\d+)?)x(\d+(?:\.\d+)?) 

DEMO

Пояснение:

\b      the boundary between a word char (\w) and 
         something that is not a word char 
(      group and capture to \1: 
    \d+      digits (0-9) (1 or more times) 
    (?:      group, but do not capture (optional): 
    \.      '.' 
    \d+      digits (0-9) (1 or more times) 
)?      end of grouping 
)      end of \1 
x      'x' 
(      group and capture to \2: 
    \d+      digits (0-9) (1 or more times) 
    (?:      group, but do not capture (optional): 
    \.      '.' 
    \d+      digits (0-9) (1 or more times) 
)?      end of grouping 
)      end of \2 
0
(\d+(?:\.\d+)?)(?=x)|(?<=x)(\d+(?:\.\d+)?) 

Вы можете попробовать это. Смотрите демоверсию.

http://regex101.com/r/wQ1oW3/6

2) Для того, чтобы игнорировать длинную строку, которую вы должны использовать \b\d{1,3}\b для определения границ.

http://regex101.com/r/wQ1oW3/7

Или часть длинной строки будет соответствовать.

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