2014-12-02 3 views
0

я придумал следующее регулярное выражение, чтобы принимать значения с интервалом .25 или в формате четверть, как 1,25, 10,75, 11,50, 12, 13.регулярное выражение для значения максимального

Regular Expression

^\d+((\.0+)*|(\.250*)|(\.50*)|(\.750*))$ 

пример

Допустимые значения = 0, 0,25, 0,50, 0,75, 3, 1,25, 1,50, 1,75, 5, 10

не принимаются Значения = 0,15, 0,20, 0,26, 0,30, 1,30, 1,55

я следующие вопросы;

1- Это не принимает .25, но принимает 0,25

2- Как можно ограничить значение максимального числа, я хочу, чтобы принять до 15,5

+0

если вы делаете приращения дюймовых '1/4', как прийти, вы не можете проверить значение, чтобы увидеть, если оно больше> '15.5', что мешает вам написать некоторую условную проверку. – MethodMan

+1

' if (f> 0 && f% 0.25 == 0 && f <= 15.5) ' –

+0

' if (inches% .25 <0) && inches <15.5' – MethodMan

ответ

0

Это НЕПРАВИЛЬНО способ сделать это, но решение, тем не менее

^((1[0-4]|[0-9])?(\.(25|5|75)?0*)?|15(\.(25|5)?0*)?)$ 

DEMO

Regex r = new Regex("^((1[0-4]|[0-9])?(\\.(25|5|75)?0*)?|15(\\.(25|5)?0*)?)$"); 
string[] arr = {".25", "17.545", "3.75000","19.5","10.500","0.25"}; 

foreach(string s in arr) { 
    if (r.IsMatch(s)) { Console.WriteLine(s); } 
} 

Дает:

.25 
3.75000 
10.500 
0.25 
+0

его принимает 16, но я хочу max 15.5 – user1263981

+0

@ user1263981 - это не ... Следуйте по ссылке и введите ее в окно – arco444

+0

еще один вопрос, как я могу изменить его, чтобы принять max 4.5? – user1263981

0

вы можете попробовать это:

string input = "0, 0.25, 0.50, 0.75, 1 , 1.25 , 1.50, 1.75 0.15, 0.20, 0.26, 0.30, 1.30, 1.55"; 
double max = double.MinValue; 
var result = Regex.Replace(input, @"\b\d\.\d+\b", match =>   
    {  
    double d = double.Parse(match.Value); 
    // do whatever you want 
    if (d > max) 
     max = d; 
     return ""; 
    }); 

потому, что регулярное выражение не поддерживают математические операции

+1

Я не думаю, что OP хочет максимальное значение в списке, просто хочет ограничить соответствие значениями, которые меньше 15.5. – juharr

6

на мой взгляд, Regex не правильный инструмент для такого рода работы. Все значения, которые вы хотите принять, являются десятичными значениями, почему бы просто не разобрать введенное значение как десятичное, а затем проверить, правильно ли оно соответствует принятым значениям?

decimal number; 

if (Decimal.TryParse(value, out number)) 
    // Check if you're in the correct range 

Это будет намного проще и безошибочно.

+0

не все значения находятся в десятичном значении – user1263981

+0

все ваши принятые значения являются десятичными, по крайней мере, из вашего вопроса. TryParse не сработает и вернет false, если значение не является десятичным, поэтому вы знаете, вернет ли он true, это уже хороший формат. – Gimly

+1

@ user1263981 Как может быть кратное значение .25, которое <15.5 * not * может быть представлено как десятичное? –

0

Я думаю, что Regex - это неправильный способ сделать это, но если вы настаиваете, то следующее должно соответствовать вам.

^(\d|1[0-5]?)((\.0+)*|(\.250*)|(\.50*)|(\.750*))$ 
+0

Это не соответствует '.25' – arco444

+0

@ arco444, справа, и не должно. Он должен соответствовать '0,25', и это так. –

+0

Вопрос OP 1 предлагает мне другое? Он также соответствует '15.75' – arco444

0

Это не принимает .25, как если у вас есть \d+ в начале, что означает, что вы ждете, по крайней мере, один цифровой, прежде чем ".". Я думаю, вы могли бы изменить \d+ следующим (0|1)?[1-5]?, чтобы принять его до 15.

Подробнее см. Регкс here.

+0

'(0 | 1) * [1-5] *' будет соответствовать '555555555' .... i.e.> 15 – arco444

+0

спасибо arco444 .. – user1263981

+0

Извините за неправильное обращение. Модифицирован ? – Anna

0

Вы можете использовать это регулярное выражение:

^((?:1[0-4]|[0-9])?(?:\.(?:25|5|75))?0*|15(?:\.(?:25|5)?0*)?)$ 

Демо:http://regex101.com/r/eQ2pA1/7

+0

Матчи '51894.0000 'which is> 15 – arco444

+0

Теперь протестируйте это регулярное выражение. –

+0

Совпадения '15.75', который является> 15.5 – arco444

0

^(0|1)?[1-4]?(|\.0+|\.250*|\.50*|\.750*)$ для согласования 0-14 чисел и сделать | в соответствии с номерами 15, 15,25, 15.50 * со следующим 15(|\.0+|\.250*|\.50*)

финале один будет

^(((0|1)?[1-4]?(|\.0+|\.250*|\.50*|\.750*)) | (15(|\.0+|\.250*|\.50*)))$

Смежные вопросы