Регулярное выражение C# совпадает только в том случае, если в строке найдена одна группа чисел

#c# #regex

Вопрос:

Я пытаюсь придумать регулярное выражение для общего сценария захвата числа из строки, в которой число может содержать один или несколько нечисловых символов, предварительно/после закрепленных на нем.
Число может содержать ноль или один десятичный знак или запятую.
Если строка содержит несколько «наборов» последовательных цифр, разделенных не-цифрами, я бы хотел, чтобы регулярное выражение завершилось ошибкой («наборы», вероятно, не правильная терминология).

В качестве примера можно привести следующие входные данные, которые будут успешно совпадать:
abc12.00xyz будет соответствовать 12.00
0.1$ будет действительным и будет соответствовать 0.1
.01 будет действительным и соответствующим .01
123abc будет действительным и будет соответствовать 123
abc123 будет действительным и будет соответствовать 123

Эти входные данные не будут совпадать:
abc12.00xyz322 произойдет сбой из-за второго «набора» цифр, 322 в этом примере
12t2 произойдет сбой из-за наличия двух отдельных «наборов» цифр

Я перепробовал много перестановок и не добился большого прогресса. Это самое близкое, к чему я подошел до сих пор. Он правильно совпадает с числами, исключая нецифровые числа из совпадения, но включает в себя все «наборы» чисел в строке.

([d]*[.,])?[d]

Любые предложения будут оценены по достоинству.

Ответ №1:

Вы можете использовать группу захвата:

 ^[^0-9rn]*?([0-9]*.?[0-9] )[^0-9rn]*$
 
  • ^ Начало строки
  • [^0-9rn]* При необходимости сопоставьте любой символ, кроме цифры или новой строки, как можно меньше
  • ([0-9]*.?[0-9] ) Захватите группу 1, сопоставьте необязательные цифры, необязательную запятую и 1 цифры
  • [^0-9rn]* При необходимости сопоставьте любой символ, кроме цифры или новой строки
  • $ Конец строки

Смотрите демонстрационную версию регулярных выражений .NET (перейдите на вкладку Таблица, чтобы просмотреть значения группы захвата).

введите описание изображения здесь