2015-10-07 1 views
1

Это образец текста я бегу мое регулярное выражение на:Regex (Не включайте digit.digit)

DuraFlexHose Water 1/2" hex 300mm 30.00 

Я хочу, чтобы включить все и остановится на 30.00

Так что у меня есть в виду что-то вроде [^\d*\.\d*]*, но это не работает. Каков запрос, который поможет мне добиться этого?

+4

Вы можете использовать '^ \ Ь \ d + \ \ d +' и использование захвачена группа # 1 – anubhava

+0

(+.?). Спасибо @anubhava, что работает, но я пытаюсь пройти через это, чтобы понять это. –

+1

Разве вы не можете разделить строку пробелом (или вкладкой) и объединить назад все, кроме последних элементов? Какой язык вы используете? Если смотреть вперед, результат будет «чище»: ['^. *? (? = \ S * \ d + \. \ D + $)'] (https://regex101.com/r/mD3bS1/2). Или это CSV? Затем используйте считыватель CSV. –

ответ

1

Demo См

/.*(?=\d{2}\.\d{2})/ 
    .* matches any character (except newline) 
     Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
    (?=\d{2}\.\d{2}) Positive Lookahead - Assert that the regex below can be matched 
     \d{2} match a digit [0-9] 
      Quantifier: {2} Exactly 2 times 
     \. matches the character . literally 
     \d{2} match a digit [0-9] 
      Quantifier: {2} Exactly 2 times 
1

Если вы не можете использовать любой CSV парсер и ограничивается только регулярное выражение, я хотел бы предложить 2 регэкспы.

Это можно использовать, чтобы захватить каждый символ от начала до первой схеме optional spaces + digits(s) + . + digit(s):

^([\s\S]*?)\s*\d+\.\d+ 

См demo

В случае, если значение с плавающей точкой находится на конец колонны, используйте якорь $ (конец строки):

^([\s\S]*?)\s*\d+\.\d+$ 

См. another demo

Обратите внимание, что [\s\S] соответствует любому символу, даже новой строке. Разбивка

Regex:

  • ^ - начало строки
  • ([\s\S]*?) - (Захват группы 1) любые символы, 0 или больше, как можно иначе, 3 из 30.45 будут захвачены)
  • \s* - 0 или более пробелов, как можно больше (для отделки группы 1)
  • \d+\.\d+ - 1 или более цифр, за которыми следует период, за которым следует 1 или m рудные цифры
  • $ - конец строки.

Если вы планируете сопрягать любые поплавки, как -.05, вам нужно будет заменить \d+\.\d+ с [+-]?\d*\.?\d+.

Вот как это можно использовать:

var str = 'DuraFlexHose Water 1/2" hex 300mm 300.00'; 
 
var res = str.match(/^([\s\S]*?)\s*\d+\.\d+/); 
 
if (res !== null) { 
 
    document.write(res[1]); 
 
}

+0

FYI: Используя выбранное в данный момент решение, [результат не будет того, что вы ожидаете] (https://regex101.com/r/vS9sU1/1), если ваш вход может содержать более чем 2-значную целую часть (например, 'DuraFlexHose Вода 1/2 "гексагон 300 мм 300,00'). –

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