2016-08-19 3 views
-1

Я пишу программу для преобразования римских цифр в целые числа. Метод, который я делаю, ищет подстроку, которая означала бы вычитания (IX, CM, XC) и добавление соответствующей суммы к подсчету. Например, если CM находится в строке MMMMCMXCIX, тогда установите столбец сотен на 9.Подстановка выражения регулярного выражения Java

Я пытаюсь сделать это с

if(romanNum.matches("CM")){ 
     hundreds = 9; 
     romanNum.replaceAll("CM", ""); 
    } 

, но он никогда не входит в, если заявление. С помощью thesetwo проверок регулярных выражений со строкой MMMMCMXCIX и регулярным выражением только как CM оба они выделяют совпадение, но мой код предполагает иное. Почему это?

+0

'Matcher.matches()' проверяет, соответствует ли ** всем входным данным ** шаблону, другими словами, он соответствует только в том случае, если вход точно соответствует «CM», а не «MMMMCMXCIX». Вместо этого используйте другие методы, такие как ['Matcher.find()'] (http://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#find--). – Jesper

+0

В коде есть несколько проблем. 1) Используйте 'contains', чтобы проверить, содержит ли строка подстроку, 2) присваивает замененные значения переменной, 3) замену литерала подстроками должно выполняться с помощью' String # replace', а не 'replaceAll'. –

ответ

0

String#matches соответствует всему String против вашей подстроки, поэтому ваше состояние никогда не срабатывает, если ваше значение String не состоит только в "CM". не

Либо:

  1. использование String#contains (без регулярных выражений):

    например if(romanNum.contains("CM"))

  2. или использовать Matcher Против Pattern явно:

    например, if (Pattern.compile("CM").matcher(romanNum).find())

    Обратите внимание, что это не имеет смысла, как есть (предпочтительнее решение 1), если у вас нет фактического рисунка.

Наконец, вы, вероятно, хотите использовать replace вместо replaceAll если вы только замена литералов.