Проверка пользовательского выражения с помощью ER - PullRequest
2 голосов
/ 30 января 2012

Я пытаюсь проверить пользовательское выражение. Это выражение содержит следующие условия:

  • Номер позиции;
  • Тип операции;
  • Выражение;
  • Псевдоним (необязательно);
  • Комментарий (необязательно);

Условия отделяются "|" труба. Итак, четыре трубы это предел.

Итак, чтобы быть правильным выражением:

0 | S | написать (& var1) | alias1 | мой комментарий - ОК
0 | K | написать (& var1) | alias1 | мой комментарий - FAIL
1 | I | прочитать (& var2) | alias2 | - ОК
1 | S | прочитать (& var1) || - ОК
2 | N | if (& var1 == & var2); читать (& var3) || - ОК
3 | S ||| - FAIL
3 | I | запись (& var1) | псевдоним 3 | - FAIL
3 | N | написать (& var1) | alias1 | мой комментарий | - FAIL

Я использую этот ER для проверки:

* * * 1 022 (\ д {} 1,10) \ | (S | M | I | N), \ | \ (+.?) | ([A-Za-Z0-9] +) \ |? (. +)

Но я не могу проверить выражение, которое заканчивается на трубе. Потому что в комментарии может быть любой символ, кроме трубы ...

Какая-то идея ??

Спасибо

Ответы [ 2 ]

1 голос
/ 30 января 2012

Попробуйте использовать [^|] вместо (.+)? в конце вашего регулярного выражения:

^(\d{1,10})\|(S|M|I|N)\|[^|]+\|([a-zA-Z0-9]*)\|([^|]*)$

В качестве примечания: для каждого подвыражения subexpr следующие регулярные выражения эквивалентны:

((subexpr)+)?

и

(subexpr)*
0 голосов
/ 30 января 2012

Если это какой-либо символ, кроме канала, вы можете изменить регулярное выражение, добавив в конце это правило:

^(\d{1,10})\|(S|M|I|N)\|(.+?)\|([a-zA-Z0-9]+)?\|([^\|]+)?$
...