C # регулярное выражение для соответствия точному числу (включая целые и десятичные числа) - PullRequest
1 голос
/ 28 марта 2019

Резюме

Я пытаюсь использовать регулярное выражение, чтобы найти точное число (то есть число, понятное человеку, а не саму цифру) в большей строке. Число, которое я пытаюсь найти, будет различным. Это может быть целое число или десятичное число, и это может быть одна цифра или несколько цифр.

Примеры

  • Если вы пытаетесь сопоставить число 2, я хочу, чтобы оно нашло 2 в x + 2 + 3, а не в 2.5, 2.52 или 5.2 (потому что это цифра 2, а не фактическое число 2).
  • Если попытаться сопоставить число 2,5, я хочу, чтобы оно нашло 2,5 в x + 2.5 + 3 и 2.5, но не 2.52 или 12.5.

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

Начальная попытка

Я начал с (\bX\b)+ (где X будет номером, который я хочу сопоставить), который работает, когда X равен 2,5, но не когда X равен 2. Это потому, что он использует разрывы слов для определения начала и конца число, но десятичная точка считается как разрыв слова. Это означает, что если X равен 2 (то есть регулярное выражение равно (\b2\b)+), оно будет соответствовать числу 2 (правильно), но также 2.x (неверно) и x.2 (также неверно).

Текущая попытка

Я исправил проблему 2.x, изменив выражение на (\bX\b(?!\.))+. Это исключает числа, где за X следует десятичная точка, поэтому, если X равно 2, оно будет соответствовать 2 (правильно), не будет соответствовать 2.x (правильно), но все равно будет соответствовать x.2 (неправильно). Если X - десятичное число, это работает правильно (поэтому, если X равно 2,5, оно будет правильно соответствовать 2.5 и исключать 12.5 или 2.51).

Как мне избежать совпадения X, если ему предшествует десятичная точка?

Реальный вариант использования

Если это поможет, конечная цель - использовать это с функцией C # Regex.Replace следующим образом:

private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
    return Regex.Replace(originalFormula, $@"(\b{numberToReplace}\b(?!\.))+", textToReplaceNumberWith);
}

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Вы можете использовать

private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
    return Regex.Replace(originalFormula, $@"(?<!\d\.?){Regex.Escape(numberToReplace.ToString())}(?!\.?\d)", textToReplaceNumberWith);
}

См. Демонстрацию C #

(?<!\d\.?){Regex.Escape(numberToReplace.ToString())}(?!\.?\d), учитывая, что переменная внутри равна 2.5, переводится в (?<!\d\.?)2\.5(?!\.?\d) и соответствует 2.5, только если

  • (?<!\d\.?) - без предшествующей цифры и необязательного .
  • (?!\.?\d) - без дополнительного . и затем цифру.

См. демонстрационный пример регулярных выражений .

Более простое регулярное выражение, которое будет работать с вводомнапример, у вас есть только , может быть граница слова + шаблон на основе внешнего вида, например

private static string ReplaceNumberWithinFormula(string originalFormula, double numberToReplace, string textToReplaceNumberWith)
{
    return Regex.Replace(originalFormula, $@"\b(?<!\.){Regex.Escape(numberToReplace.ToString())}\b(?!\.)", textToReplaceNumberWith);
}

Здесь регулярное выражение будет выглядеть как \b(?<!\.)2\.5\b(?!\.) и сначала будет соответствовать позиции границы слова (с \b), затем удостоверится, что прямо перед местоположением нет .(?<!\.)), затем совпадет с 2.5, убедившись, что сразу после числа нет слова char (буква, цифра или _)затем проверим, что после номера нет ..См. эту демонстрацию регулярных выражений .

Она равна $@"(?<![\w.]){Regex.Escape(numberToReplace.ToString())}(?![\w.])" и является более строгой, чем верхнее решение, которое позволит вам найти точное число с плавающей точкой или целое число в любом контексте.

0 голосов
/ 28 марта 2019

Я думаю, это то, что вы ищете

^\d+(\.\d+)?\b
  • Это соответствует целым числам, таким как 2

  • Соответствует десятичным числам, таким как 2,1

  • Не соответствует шаблонам, таким как 2. или .3

0 голосов
/ 28 марта 2019

Добавьте также отрицательный вид сзади:

((?<!\.)\b2\b(?!\.))+

Проверьте демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...