Проверьте форматирование строки - PullRequest
1 голос
/ 02 октября 2011

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

Возьмите следующую строку:

24: Что-то (правда, ложь, правда) [0,1,0]

Я хочу иметь возможность сделать две вещи в этом случае. Мне нужно проверить, выполняются ли все следующие условия:

  • Существует только одно: Достигнуто с помощью Split (), которое мне нужно было использовать в любом случае для разделения двух частей.
  • Целое число перед: это 1-3-значное число int Простая логика int.parse
  • () существует, и что "Нечто", в данном случае любая строка длиной менее 10 символов, существует
  • [] существует и содержит как минимум 1 целое число. Также убедитесь, что элементы в [] являются целыми числами, разделенными на

Как мне лучше всего это сделать? РЕДАКТИРОВАТЬ: Я вычеркнул то, что я достиг до сих пор.

Ответы [ 3 ]

3 голосов
/ 02 октября 2011

Регулярное выражение - самый быстрый способ.В зависимости от сложности он также может быть самым дорогим в вычислительном отношении.

Кажется, это делает то, что вам нужно (я не очень хорош, поэтому могут быть лучшие способы сделать это):

^\d{1,3}:\w{1,9}\((true|false)(;true|;false)*\)\[\d(,[\d])*\]$

Объяснение

\d{1,3} от 1 до 3 цифр

:, за которым следует двоеточие

\w{1,9} сопровождаемый 1-9 символами буквенно-цифровая строка,

\((true|false)(;true|;false)*\), сопровождаемая круглыми скобками, содержащими "true" или "false", сопровождаемые любым числом "; true" или "; false ",

\[\d(,[\d])*\], за которым следует другой набор скобок, содержащий цифру, за которой следует любое число запятой + цифра.

^ и $ в начале и конце строкиукажите начало и конец строки, что важно, поскольку мы пытаемся убедиться, что вся строка соответствует формату.

Пример кода

var input = "24:Something(true;false;true)[0,1,0]";

var regex = new System.Text.RegularExpressions.Regex(@"^\d{1,3}:.{1,9}\(.*\)\[\d(,[\d])*\]$");
bool isFormattedCorrectly = regex.IsMatch(input);

Credit @Ян Нельсон

2 голосов
/ 02 октября 2011

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

Моя поспешная попытка выглядит примерно так:

var input = "24:Something(true;false;true)[0,1,0]";

var regex = new System.Text.RegularExpressions.Regex(@"^\d{1,3}:.{1,9}\(.*\)\[\d(,[\d])*\]$");

System.Diagnostics.Debug.Assert(regex.IsMatch(input));

Этот онлайн-тестер RegExдолжно помочь уточнить выражение.

1 голос
/ 02 октября 2011

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

string s = "24:Something(true;false;true)[0,1,0]";
Regex pattern = new Regex(@"^\d{1,3}:[a-zA-z]{1,10}\((true|false)(;true|;false)*\)\[\d(,\d)*\]$");

if (pattern.IsMatch(s))
{
   // s is valid
}

Если вы хотите что-то внутри (), вы можете использовать следующее регулярное выражение:

@"^\d{1,3}:[a-zA-z]{1,10}\([^:\(]*\)\[\d(,\d)*\]$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...