#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 (перейдите на вкладку Таблица, чтобы просмотреть значения группы захвата).