Чтобы быть ясным: если достаточно простого оператора if
if(num < -2055 || num > 2055) {
throw new IllegalArgumentException("num (" + num + ") must be between -2055 and 2055");
}
To ясно: если достаточно простого оператора if
, использование регулярных выражений для проверки числовых диапазонов не рекомендуется.
Кроме того, поскольку регулярные выражения анализируют строки, номера должны сначала переводиться в строку перед тем, как они могут быть протестированы. Исключением является то, что число уже является строкой, например, при получении пользовательского ввода с консоли.
(Чтобы гарантировать, что строка начинается с номера, вы можете использовать org.apache.commons.lang3.math.NumberUtils#isNumber(s)
)
Кроме того, поскольку регулярные выражения анализируют строки, номера сначала должны быть переведены в строку перед их тестированием. Исключение составляет то, что число уже является строкой, например, при получении пользовательского ввода с консоли.
Несмотря на это, выяснение того, как проверять диапазоны чисел с регулярными выражениями, является интересным и
(Ссылки в этом ответе взяты из Часто задаваемых вопросов регулярных выражений переполнения стека .)
(Чтобы гарантировать, что строка начинается с номера, вы можете использовать org.apache.commons.lang3.math.NumberUtils#isNumber(s)
)
\b15\b
Правило: Число должно быть точно 15
.
Самый простой диапазон. Регулярное выражение соответствует
Границы слова необходимы, чтобы избежать соответствия 15
внутри 8215242
.
\b(15|16)\b
\b1(5|6)\b
\b1[5-6]\b
Правило: Число должно быть между 15
и 16
. Вот три возможных регулярных выражения:
(Группы требуются для «или» -инга, но они могут быть не захватывающими : \b(?:15|16)\b
)
\b(\d|1[0-2])\b
\b( //The beginning of a word (or number), followed by either
\d // Any digit 0 through 9
| //Or
1[0-2] // A 1 followed by any digit between 0 and 2.
)\b //The end of a word
Правило: Число должно быть между -12
и 12
.
-?\b(\d|1[0-2])\b
Здесь является регулярным выражением для 0
через 12
, только с положительным значением:
Свободно-разнесенный:
(?
Выполнение этой работы как для отрицательной, так и для положительной так же просто, как добавление необязательная тире в начале:
(Предполагается, что перед тире не должно быть никаких недопустимых символов.)
Чтобы запретить отрицательные числа, отрицательный lookbehind необходимо:
Правило: Число должно быть между -12
и 12
.
Выход из внешнего вида приведет к тому, что 11
в -11
будет соответствовать. (Первый пример в этом сообщении должен содержать это.)
\d
по сравнению с [0-9]
Вот регулярное выражение для 0
- 12
, только для положительного:
(?
Чтобы быть совместимым со всеми ароматами регулярных выражений, все \d
-s следует изменить на [0-9]
. Например, .NET рассматривает не ASCII-номера, например, на разных языках, как законные значения для \d
. За исключением последнего примера, для краткости он оставлен как \d
.
(?
Свободно-разнесенный:
\b(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299|300|301|302|303|304|305|306|307|308|309|310|311|312|313|314|315|316|317|318|319|320|321|322|323|324|325|326|327|328|329|330|331|332|333|334|335|336|337|338|339|340|341|342|343|344|345|346|347|348|349|350|351|352|353|354|355|356|357|358|359|360|361|362|363|364|365|366|367|368|369|370|371|372|373|374|375|376|377|378|379|380|381|382|383|384|385|386|387|388|389|390|391|392|393|394|395|396|397|398|399|400)\b
(С благодаря @TimPietzcker )
работа как с отрицательной, так и с положительной так же просто, как добавление опциональной в начале:
Правило: Должно быть между 0
и 400
.
(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?
Возможное регулярное выражение:
Свободное разнесение:
Другая возможность, которая никогда не должна использоваться:
( //Capture group for the entire number
-?\b //Optional dash, followed by a word (number) boundary
(?:20 //Followed by "20", which is followed by one of
(?:5[0-5] //50 through 55
| //or
[0-4][0-9]) //00 through 49
| //or
1[0-9]{3} //a one followed by any three digits
| //or
[1-9][0-9]{0,2} //1-9 followed by 0 through 2 of any digit
| //or
(?
Правило: Должно быть между -2055
и 2055
Это из вопроса в stackoverflow.
(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1?[0-9]{1,3})\b)
Regex:
-?\b(20(5[0-5]|[0-4][0-9])|1?[0-9]{1,3})\b
[/g29]
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.math.NumberUtils;
/**
Confirm a user-input number is a valid number by reading a string an testing it is numeric before converting it to an it--this loops until a valid number is provided.
{@code java UserInputNumInRangeWRegex}
**/
public class UserInputNumInRangeWRegex {
public static final void main(String[] ignored) {
int num = -1;
boolean isNum = false;
int iRangeMax = 2055;
//"": Dummy string, to reuse matcher
Matcher mtchrNumNegThrPos = Pattern.compile("(-?\\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?
Возможное регулярное выражение:
[C:\java_code\]java UserInputNumInRangeWRegex
Enter a number between -2055 and 2055: tuhet
Not a number. Try again.
Enter a number between -2055 and 2055: 283837483
Not in range. Try again.
Enter a number between -2055 and 2055: -200000
Not in range. Try again.
Enter a number between -2055 and 2055: -300
Number: -300
Свободно-разнесенный:
Свободный интервал:
(-?\b(?:20(?:5[0-5]|[0-4][0-9])|1[0-9]{3}|[1-9][0-9]{0,2}|(?
(Wi th благодаря PlasmaPower и Casimir et Hippolyte для помощи при отладке.)
Это проблема с библиотекой, которую вы пытаетесь использовать. Проверьте этот вопрос , указанный в репозитории Github. Попытайтесь использовать вкладки native-base , если сможете. Это может помочь вам в этой ситуации. Если вы все еще получаете ошибку, вы можете сгенерировать вкладки вручную с помощью написанного вручную кода, который, по моему мнению, занимает много времени, но лучшее решение.