Как извлечь из строки число, разделенное запятыми - PullRequest
1 голос
/ 24 января 2012

Я ОЧЕНЬ новичок в регулярных выражениях и пока не могу полностью обернуться вокруг него.

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

регулярное выражение 1: Строка, с которой я тестирую - Размер на диске: 25 754 900 936 байт

В нем несколько ведущих пробелов, но текст ВСЕГДА одинаков. Я пытаюсь извлечь только число (25 754 900 936).

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

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

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

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 ]

2 голосов
/ 24 января 2012

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

(\d+,?)+

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

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

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

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

'Regex is your regular expression object containing the second regex
regex.Match([your string]).Value
0 голосов
/ 24 января 2012

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

/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 кконец ввода.

...