2013-02-13 3 views
2

Я пытаюсь сопоставить математическое уравнение с использованием регулярного выражения (в Objective-C в приложении iPhone) и может использовать помощь при создании регулярного выражения, которое работает для второй сценарий, указанный ниже.Регулярное выражение NSString для извлечения отрицательных чисел как часть уравнения

Я создал следующий код Objective-C, чтобы извлечь уравнение формы (1÷4) или (-1÷4), если перед продуктом или разделителем есть отрицательное число: (я включаю это здесь, чтобы помочь объяснить вопрос, который я пытаюсь ответить)

NSString* equation = @"1+(-1÷4)"; 
NSString* matcher = @"(-){0,1}(\\.|\\d)+(÷|×){1,}"; 
    NSRegularExpression *equation_regex = [NSRegularExpression regularExpressionWithPattern:matcher options:NSRegularExpressionCaseInsensitive error:nil]; 
    while([equation_regex numberOfMatchesInString:working_function options:0 range:NSMakeRange(0, [equation length])]) 
    { 
    // regex finds '-1÷4' 
} 

Однако, это распадается в течение следующего уравнения: 3-1 ÷ 4, где -1 не должны быть извлечены, так как это не входит в 1 ÷ 4 в уравнении.

Я попытался изменить регулярное выражение exlucde -1 IFF есть несколько впереди из - через следующее (с моим ограниченным опытом регулярных выражений!):

NSString* equation = @"3-1÷4"; 
NSString* matcher = @"((^\\d)(-)){0,1}(\\.|\\d)+(÷|×){1,}"; 
    NSRegularExpression *power_regex = [NSRegularExpression regularExpressionWithPattern:power_regex_pattern options:NSRegularExpressionCaseInsensitive error:nil]; 
    while([power_regex numberOfMatchesInString:working_function options:0 range:NSMakeRange(0, [working_function length])]) 
    { 

} 

Если регулярное выражение ((^\\d)(-)){0,1} это мой попытайтесь только совместить отрицательную часть, если нет ведущей цифры на - (т.е. 1÷4, а не -1÷4), которая не работает, следовательно, вопрос. Надеюсь, я объяснил это достаточно! Заранее спасибо.

+1

Мне просто интересно, почему вы не расширили формулу нулевым числом, когда вы обнаруживаете сиротского оператора '', прежде чем вы начнете работать, то есть '1 + (- 1 ÷ 4)' становится '1+ (0-1 ÷ 4)' и '3-1 ÷ 4' становится' 3-1 ÷ 4' (что то же самое), и у вас не будет проблемы с созданием общего регулярного выражения, и конечным результатом должно быть s ame, потому что начальный ноль не изменит формулу. – holex

+0

На самом деле, @holex, ваше предложение приводит к дальнейшему мышлению и настройке моего кода, который решает -1 ÷ 4, который был только оборудован для управления ** числом, продуктом, номером **. Я изменил его, чтобы справиться с ** продуктом, номером, продуктом, номером **. Это решает проблему, но как мне закрыть этот вопрос? Я рад держать его открытым, если кто-то может решить исходное регулярное выражение Q, которое все еще будет полезно, и обсудить решение, которое может быть полезно для потомков? –

ответ

1

Если вы хотите, чтобы избежать согласования -, если ему предшествует цифра, вы могли бы использовать

"((?<!\\d)-)?[\\d.]+[÷×][\\d.]+" 

в ((?<!\\d)-)? Замыкающий ? делает - необязательным, и если он присутствует, отрицательный look- за (?<!\\d) предотвращает совпадение, если ему предшествует цифра.

[\\d.]+ соответствует 0-9 или . один или несколько раз.

Примечание: только тестируется с использованием класса java.util.regex, хотя я считаю, что класс NSRegularExpression аналогичен.

Edit:

Я считаю, что трудно понять, что именно вы пытаетесь сделать, но если вы просто пытаетесь соответствовать отрицательное число, если оно не предшествует цифра, вы могли бы использовать

+0

Это сработало. Конечным регулярным выражением является '@" ((?

+1

@JohnDunne. Обратите внимание, что '(÷ | ×) {1,}' означает 'один _или больше_ либо '÷', либо '×'. Если вы хотите только один из них, используйте '[÷ ×]' или '(÷ | ×)', если вы хотите его захватить.Если вы используете скобки для записи чисел, вам нужно использовать '(\\ d +)' not '(\\ d) +'. Чтобы захватить '-' для любого номера, вы также можете использовать' '((?: (? MikeM

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