Проверьте правильность структуры строк и различите их - PullRequest
4 голосов
/ 03 мая 2019

Я делаю выигрышное приложение для домашней работы, которое загружает квадратные или линейные уравнения из текстового файла. У меня есть 2 формата: ax^2 + bx + c = 0 или ax + b = 0

Моя проблема в том, что мне нужно различить, является ли он квадратичным или линейным, и проверить, имеют ли они правильный формат, но у меня есть проблема со строковым шаблоном, придумала что-то подобное, но это не работает

string pattern = @"?([+-]?([0-9]*[.])?[0-9]+\w{1}[^2])([+-][0-9]*[.])?[0-9]+\w{1})([0-9]*[.])?[0-9]+ \=[0]);

Поскольку я не понимаю регулярных выражений, я бы очень хотел спросить вас, не могли бы вы помочь мне с строковым шаблоном, который по выбору будет соответствовать 1-й части в формате (+ -, число с плавающей запятой, символ ^ 2), а затем 2-й части (+ -, число с плавающей точкой, символ) и последняя часть (+ -, число с плавающей точкой, = 0)

Ответы [ 3 ]

1 голос
/ 03 мая 2019

Эта часть ваших выражений [^2] - это класс символов с отрицанием, который соответствует любому символу, кроме 2

Если вы хотите сопоставить его буквально за пределами класса символов, вы должны экранировать его \^, иначе его значение будет якорем для подтверждения начала строки.

Использование \w соответствует символу слова, а также может совпадать с цифрами и подчеркиванием. Если вы хотите сопоставить a-z, вы можете добавить это в класс символов. Обратите внимание, что вы можете опустить {1}.

Вы можете использовать необязательную группу (?:)? для первой части:

(?:[+-]?\d+(?:\.\d+)?[a-z]\^2 [+-] )?\d+(?:\.\d+)?[a-z] [+-] \d+(?:\.\d+)? = 0

Это будет соответствовать:

  • (?: Группа без захвата
    • [+-]? Дополнительно + или -
    • \d+(?:\.\d+)? Совпадение 1+ цифр с необязательной десятичной частью
    • [a-z]\^2 [+-] Соответствует символу a-z, затем ^2 пробел необязательно + или - и пробел
  • )? Закрыть группу без захвата и сделать ее необязательной
  • \d+(?:\.\d+)?[a-z] [+-] Совпадение цифр 1+ с необязательной десятичной частью, char a-z, пробел, необязательный + или - и пробел
  • \d+(?:\.\d+)? = 0 Совпадение цифр 1+ с необязательной десятичной частью, пробел = пробел 0

Например

String pattern = @"(?:[+-]?\d+(?:\.\d+)?[a-z]\^2 [+-] )?\d+(?:\.\d+)?[a-z] [+-] \d+(?:\.\d+)? = 0";

Regex demo | C # демо

На основании комментария dotNET , если переменная должна быть такой же, вы можете использовать группу захвата с обратной ссылкой \1. Чтобы соответствовать обоим форматам, вы можете использовать чередование и привязки, чтобы утверждать начало и конец строки.

Regex demo

1 голос
/ 03 мая 2019

Попробуйте этот шаблон.Он может не поймать странные ситуации.

([+-]*(\d+x)\^2\s*[+-]\s*)*(\d+x\s*[+-]\s*\d+\s*)=\s*\d+

Разбить его:

  • ([+ -] (\ d + x) \ ^ 2 \ s [+ -] \ s *) * - первая группа захвата: необязательный квадратик
    • [+-]* - положительный / отрицательный символ (*) делает его необязательным
    • (\d+x) - \d+ - это одна или несколько цифр (цифр), а x - это символ «х».Вы можете заменить это любым символом или [a-zA-Z]{1} для любой одной буквы
    • \^2 - литерал для «^ 2» (необходимо экранировать символ «^»)
    • \s* -необязательный пробел
    • [+-] - + или -
    • \s* - необязательный пробел
    • * - делает группу необязательной, поэтому она не будет работать, еслиего там нет
  • (\ d + x \ s * [+ -] \ s * \ d + \ s *) - вторая группа захвата: линейная часть (требуется - можно добавить * кконец сделать необязательным)
    • \d+x - любой номер, за которым следует «x» (аналогично первой группе)
    • \s* - необязательный пробел
    • [+-] -либо + или -
    • \s* - необязательный пробел
    • \d+ - последний фрагмент уравнения (например: + 5) (обязательно - можно заключить в скобки и добавить * в конец, чтобы сделатьнеобязательно)
    • \s* - необязательный пробел
  • = \ s * \ d +
    • = - знак равенства
    • \s* - необязательный пробел
    • \d+ - любое число после знака равенства

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

Надеюсь, это поможет.

1 голос
/ 03 мая 2019

Что-то в следующих строках обнаружит для вас квадратные уравнения.Это не 100% отказоустойчиво, но должно работать в большинстве случаев:

[+-]?\d*(\.\d+)?(?<var>\w)\^2\s*[+-]\s*\d*(\.\d+)?(?P=var)\s*[+-]\s*\d*(\.\d+)?

будет принимать вещи в виде ax^2 + bx + c, где a, b и c являются числами с плавающей точкой.

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

var F = $"\d*(\.\d+)?";  //a floating number
var S = $"\s*[+-]\s*";   //+/- sign with leading/trailing space(s)
var Quad = "[+-]?" + F + $"(?<var>\w)\^2" + S + F + $"(?P=var)" + S + F
var Lin = F + $"\w" + S + F + $"\s*=\s*0"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...