2015-05-29 10 views
3

Для следующей строки мне нужно регулярное выражение, чтобы получить значения вне двойных кавычек, а именно: 0.0 и 100.5.Формула C# regex

"VAL_ 344 PedalPos 0.0 \"% (0.0 ... 100.0)\" 100.5 \"Invalid - Undefined (100.5 ... 127.5)\";" 

Используя это правило Regex.Match(line, "\"\\s[0-9]+\\s\""), я получаю одну группу, и это первое значение: 0.0. Я не могу понять, как расширить поиск, чтобы включить все следующие значения.

Принимая во внимание эту часть [0-9], я думаю, что это применимо только к целочисленным значениям, я добавил точку [0-9.], и это включало в себя все двойные числа. Правильно ли это?

+1

Похоже, вы также хотите извлечь '344', правильно? –

+0

@stribizhev, нет .. это значение является идентификатором. Его не следует добавлять. –

+0

И каков критерий для идентификаторов? Всегда после 'VAL_'? Просьба уточнить. –

ответ

1

я предлагаю следующий подход:

1) Удалите все строки в кавычках,

2) Extract все числа, которые не предшествуют VAL_.

var txt = "VAL_ 344 PedalPos 0.0 \"% (0.0 ... 100.0)\" 100.5 \"Invalid - Undefined (100.5 ... 127.5)\";"; 
txt = Regex.Replace(txt, @"""[^""]*""", string.Empty); 
var results = Regex.Matches(txt, @"(?<!VAL_\s+)-?\b\d*\.?\d+\b"); 

Выход:

enter image description here

Regex объяснение:

  • "[^"]*" - Матч строку в кавычках
  • (?<!VAL_\s+)\b\d*\.?\d+\b:
    • (?<!VAL_\s+) - Отрицательный просмотра назад, чтобы проверить, если номер не предшествует с постоянной VAL_ строки и 1 или более пробелами
    • \b\d*\.?\d+\b - Матч целого слова, которое является числом с плавающим (немного упрощен, но он будет работать даже с .04 -подобные значения).
+0

Надеюсь, мои объяснения хороши. И этот вопрос ни в коем случае не является дубликатом. –

+0

@ Rawling: Допустимые действительные ответы являются ПЛОХОЙ. Я проверяю свои ответы перед публикацией. Вам не нравится вопрос? Снизьте вопрос. –

+1

Прошу прощения, что некоторые важные детали были упомянуты в комментариях. Действительно, я не уделял достаточного внимания, я просто сосредоточился на своих ценностях и пропустил это первое целое после VAL_. Но этот ответ дает ожидаемый результат, и я благодарю stribizhev дважды, один раз за его формулу, а также за его вопрос о значении 344. –

1

Пробуйте "\s(\d+\.?\d*)\s" (string regex = "\"\\s(\\d+\\.?\\d*)\\s\""; в коде) и делайте результат первой группы.

1

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

@"VAL_\s*\d+|""[^""]+""|(\d+(?:\.\d+)?)" 

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

string text = "VAL_ 344 PedalPos 0.0 \"% (0.0 ... 100.0)\" 100.5 \"Invalid - Undefined (100.5 ... 127.5)\";"; 
var re = new Regex(@"VAL_\s*\d+|""[^""]+""|(\d+(?:\.\d+)?)", RegexOptions.IgnoreCase); 
var textmatches = re.Matches(text); 
Console.WriteLine("Result:"); 
foreach (Match match in textmatches) 
{ 
    Console.WriteLine(match.Groups[1].Value); 
} 

ideone demo

VAL_\s*\d+ матчи VAL_ следуют необязательные пробелы и цифры для идентификаторов,

""[^""]+"" получает все в двойных кавычках,

(\d+(?:\.\d+)?) и, наконец, это получает числа.Я использовал базовый, поэтому, если у вас более сложные номера (негативы, научный формат и т. Д.), Вам придется соответствующим образом изменить это.

+0

Это должно быть более эффективным, чем использование двух регулярных выражений и работает, даже если то, что у вас есть между круглыми скобками, содержит более двух чисел, разделенных пробелами. – Jerry

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