Я согласен с Welbog, что до / постобработка должна быть лучшим выбором.
НО, поскольку мне так нравится RegEx, вот мое решение.
^[ \t]*(?:(?:0|[1-9][0-9]?|100)(?:(?:\-|\.\.)(?:0|[1-9][0-9]?|100))?|(?:[<>]=?)(?:0|[1-9][0-9]?|100))(?:[ \t]*,[ \t]*(?:(?:0|[1-9][0-9]?|100)(?:(?:\-|\.\.)(?:0|[1-9][0-9]?|100))?|(?:[<>]=?)(?:0|[1-9][0-9]?|100)))*[ \t]*$
'\s
' не используется, так как может включать в себя '\n
' в некоторых движках.
'\d
' не используется, так как вам потребуется [1-9]
, поэтому [0-9]
будет проще в использовании.
'(?:0|[1-9][0-9]?|100)
' будет соответствовать числу от 0 до 100 без нуля в начале.
'(?:[<>]=?)(?:0|[1-9][0-9]?|100)
' будет соответствовать условиям, следующим за числом (если вы также хотите сопоставить '=
', просто настройте его).
'(?:0|[1-9][0-9]?|100)(?:(?:\-|\.\.)(?:0|[1-9][0-9]?|100))?
' будет соответствовать номеру с необязательным диапазоном или последовательностью.
Полное объяснение:
^
[ \t]* // Prefix spaces
(?: <i>// A valid term</i>
<i>// A number</i>
(?:0|[1-9][0-9]?|100)
<i>// Optional range or sequence</i>
(?:
(?:\-|\.\.)
(?:0|[1-9][0-9]?|100)
)?
|
<i>// Condition and number</i>
(?:[<>]=?)(?:0|[1-9][0-9]?|100)
)
(?: <i>// Other terms</i>
[ \t]*,[ \t]* // Comma with prefix and suffix spaces
(?: <i>// A valid term</i>
<i>// A number</i>
(?:0|[1-9][0-9]?|100)
<i>// Optional range or sequence</i>
(?:
(?:\-|\.\.)
(?:0|[1-9][0-9]?|100)
)?
|
<i>// Condition and number</i>
(?:[<>]=?)(?:0|[1-9][0-9]?|100)
)
)*
[ \t]* <i>// Tail spaces</i>
Я тестирую с помощью регулярного поиска Eclipse, и он работает.
Надеюсь, это поможет.