2012-01-24 3 views
1

Я ОЧЕНЬ новичок в регулярном выражении и не могу довести мою голову до конца.Как извлечь номер, разделенный запятой, из строки

Я пытаюсь написать два регулярных выражения - вам нужно будет сказать мне, возможны ли они. Оба они основаны на синтаксисе VB.net.

Regex 1: Строка Я тестирую против - Размер на диске: 25754900936 байт

Он имеет несколько ведущих пространств, но текст всегда одинаков. Я пытаюсь извлечь только номер (25 754 900 936).

Я пробовал несколько регулярных выражений, но я не могу получить все на одной линии. Запятые меня перепутали и вернули несколько совпадений (например, \ d + \ W + дает мне четыре совпадения, по одному для каждого набора чисел, разделенных запятыми).

Лучшее, что я сделал, это [0-9/,] *, но это дает мне 25 пустых совпадений и одно совпадение (по совпадению 19) от числа. Мне нужно это для того чтобы сопрягать на спичке 1.

Doable? Видеть регулярное выражение, где я могу извлечь такое число из строки, было бы очень полезно.

Regex 2:
Такая же идея, но теперь многострочная.

Строка Я тестирую против -

  0 File(s)    0 bytes 
      1 File(s)   11,546 bytes 
      1 File(s)  259,584 bytes 
      3 File(s)   5,682 bytes 
     17218 File(s) 25,705,262,230 bytes 

мне нужно только общее число байтов на этой последней строке (25,705,262,230). Можно ли это сделать в многострочном поиске? То же самое дело - текст всегда один и тот же.

ответ

2

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

(\d+,?)+ 

Это будет соответствовать группам одного или более цифр (0-9), сопровождаемая запятой (,?), которые происходят один или больше раз.

Для вашего многострочнога строки, если вы знаете, что строка всегда будет заканчиваться «байт», попробуйте следующее:

(\d+,?)+(?=\s*bytes$) 

Это будет снова соответствовать аналогично первому регулярному выражению, хотя линия должна заканчиваться " байты 'как $ обозначает конец строки. Затем нужно извлечь захваченное значение:

'Regex is your regular expression object containing the second regex 
regex.Match([your string]).Value 
+0

James - оба действительно работали, но я на самом деле не использую это в .net. Я использую стороннее приложение, которое может выполнять регулярные выражения. К сожалению, он может работать только с первым захватом первой группы. В любом случае во втором регулярном выражении вы попадете в эту позицию? Сейчас он по-прежнему имеет слово «байты» в первом первом захвате первой группы, но в остальном он совершенен. – Pat

+0

@Pat А я не вижу никаких забот. Вам нужно добавить положительный результат, чтобы конец строки («байты», которые вы не хотите захватывать) не будет включен. Я изменил второе регулярное выражение выше. Дайте мне знать, если это сработает - я извлек совпадающее значение (без байтов) просто с помощью 'regex.Match ([ваша строка]). Value' –

+0

Perfect - спасибо! – Pat

0

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

/Size on disk: ((?:\d+,?)+)/ 

и затем извлечь первую захваченную группу.В JavaScript:

var s = "Size on disk: 25,754,900,936 bytes"; 
var bytes = s.match(/Size on disk: ((?:\d+,?)+)/)[1]; 
// "25,754,900,936" 

Это регулярное выражение говорит (изнутри)

  • \d - Найти цифровой символ
    • + - ... ну, хорошо, найти один или несколько из них
  • , - а затем буквальная запятая
    • ? - ... ну, может быть; это нормально, если вы не можете найти один из тех
  • (?:…) - теперь, взять все это и относиться к нему как группа, которая нам не нужно, чтобы сохранить
    • + - позволить этой группе случиться любое число раз
  • (…) - захватить результат всего этого и сохранить его для меня
  • Ах да, и убедитесь, что прямо перед всем этим вы можете найти текст "Size on disk: "

На многострочной линии привяжите свое регулярное выражение к концу ввода. Опять же, вот пример в JavaScript:

var re = /((?:\d+,?)+) bytes$/m; 
var total = multiline.match(re)[1]; 

Вы можете увидеть его в действии здесь: http://jsfiddle.net/uFfsc/1/

Это до вас, чтобы узнать, как прикрепить регулярное выражение в .NET до конца ввода.

+0

Phrogz - спасибо за объяснение. Джеймс regex выше работал хорошо, и, к сожалению (я виноват, что не упомянул об этом), я использую стороннее приложение, которое просто принимает регулярное выражение. Это не язык программирования, который я могу добавить JavaScript и т. Д. Но ваше объяснение было отличным и помогло мне понять немного лучше, что делают регулярное выражение. – Pat

+0

Хорошее дополнение с не захватывающими круглыми скобками, поэтому обратная ссылка не создана :) –

+0

@Pat Рад помочь. – Phrogz

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