2016-02-04 2 views
1

Спасибо всем!Получение текста между ** в Java

Так что мои инструкции:

Название метода: подчеркнуть

Параметр: объект сканер, содержащий слова

Возвращаемое значение: строку, где-нибудь между парой звездочками все в верхнем регистре

Ex достаточно:emphasize(new Scanner("I am so *happy* right now! ")) должен возвращать I am so HAPPY right now!

Примечания: Ваш метод должен работать, даже если Scanner объект не содержит ни слова.

Звездочки будут попадать только попарно. Не будет странного количества звездочек.

Я понял, что первым шагом было бы вернуть значение между * * в виде шапок.

public static String emphasize(Scanner bold) 
{ 
    String str = bold.nextLine(); 
    String answer = str.substring(str.indexOf("(") + 1, str.indexOf("*")); 
    String caps = ""; 

    return answer.toUpperCase();  
} 

является то, что я до сих пор, но Java не любит, когда я использую два * * найти деталь, она дает мне все виды ошибок. Я могу сделать одно * и а), но не два, какие-то идеи?

+0

я «думаю» вы предполагается использовать 'Сканер # next' проверить каждое слово, то вы должны быть в состоянии использовать' Строка # startsWith' и 'Строковые # endsWith' найти' * ' персонажи. Затем вы можете использовать 'StringBuilder' для построения результата в соответствии с вашими другими потребностями – MadProgrammer

+0

спасибо madprogrammer! Я проверяю api для этих методов! – Elchapo

+0

Вы можете использовать Stack, нажать звезду, и в то время как стек имеет элемент в верхнем регистре буквой, и когда вы увидите другой элемент стека со звездочкой, и ваш стек будет пустым. – PeerNet

ответ

0

Это работает, я думаю. Но код немного уродлив.

public static String emphasize(Scanner bold) { 
    String emphasizedSentence = ""; 
    while (bold.hasNext()) { 
     String str = bold.nextLine(); 
     if (str.contains("*")) { 
      String[] splitted = str.split("\\*"); 
      for (int i = 0; i < splitted.length; i++) { 
       if (i % 2 == 1) { 
        str = str.replace("*" + splitted[i] + "*", splitted[i].toUpperCase()); 
       } 
      } 
      emphasizedSentence = str; 

     } 

    } 
    return emphasizedSentence; 
} 

вход:

System.out.println(emphasize(new Scanner("hello *Stack*overflow"))); 

выход:

hello STACKoverflow 

Другой вход:System.out.println(emphasize(new Scanner("hello *Stack*overflow *again*")))

+0

Что делать, если у моего ввода есть два слова для замены на верхний регистр – Backtrack

+0

Звездочки будут попадать только попарно. Никогда не будет нечетного числа звездочек (или Пусто) - из вопроса. или используйте str.contains ("*") –

+0

Я добавил новый inpu tin Другой вход. Дает ли он правильный ответ? – Backtrack

0

Это один из способ делать это.

public static String emphasize(Scanner bold) { 
    String str = ""; 
    while(bold.hasNext()) { 
     String word = bold.next(); 
     if (word.indexOf("*") != -1 && word.lastIndexOf("*") != -1) { 
      String answer = word.substring(word.indexOf("*")+1, word.lastIndexOf("*")); 
      str += " " + answer.toUpperCase() + " "; 
     } else { 
      str += " " + word + " "; 
     } 
    } 
    return str; 
} 

Так emphasize метод может сделать все слова между ** прописные. Вы также можете сделать то же самое с регулярным выражением.

+0

Что делать -1 здесь? If (word.indexOf ("*")! = -1 && word.lastIndexOf ("*")! = -1) {и +1 на следующей строке? – Elchapo

+0

Это нужно, чтобы мы действовали над словом, которое мы ищем. В этом случае 'word.indexOf (" * ")' проверяет, найдено ли мы слово, начинающееся с '*', а вторая часть 'word.lastIndexOf (" * ")' проверяет, найдено ли мы какое-либо окончание ' * 'за одно и то же слово. Потому что могут быть слова, такие как '* angry', где нет конца' * '. Поэтому мы должны убедиться, что имеем дело с правильным словом. – Bunti

+1

'+ 1' - это потому, что индекс indexof равен 0, и мы не хотим делать' * 'uppercase; только слово должно быть в верхнем регистре. – Bunti

0

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

String text = "I am so *happy* right now!"; 
Matcher m = Pattern.compile("\\*+[A-Z]+\\*\\B").matcher(text); 
1

Я хотел бы предложить вам использовать regex Это будет соответствовать всем символ, который нужно изменить в верхнем регистре

public static void main(String args[]){ 
    System.out.println(emphasize(new Scanner("hello *Stack*overflow *again*")));  
} 

public static String emphasize(Scanner bold) { 
    String input = bold.nextLine(); 
    Pattern p = Pattern.compile("(\\*)(.*?)(\\*)"); 

    Matcher m = p.matcher(input); 
    while (m.find()) { 
     String matchedString = m.group().toString(); 
     input = input.replace(matchedString, matchedString.substring(1, matchedString.length()-1).toUpperCase()); 
    } 
    return input; 
} 

о/р: hello STACKoverflow AGAIN

Я хотел бы предложить вам использовать Regex матч

+0

используйте bold.hasNext() для случая - если объект Scanner не содержит слов. –

+0

Спасибо, я ценю это, но мне сказали не использовать массив, также мне сказали использовать сканер. – Elchapo

0
public static void main(String[] args) { 

     Scanner input= new Scanner(System.in); 
     String line=input.nextLine(); 
     String output=Stream.of(line.split(" ")).flatMap(new Function<String, Stream<String>>() { 

      @Override 
      public Stream<String> apply(String s) { 
      if(s.startsWith("*") && s.endsWith("*")) { 
       return Stream.of(s.replace("*","").trim().toUpperCase()); 
      } 
      return Stream.of(s); 
      } 
     }).collect(Collectors.joining(" ")); 

     System.out.println(output); 

} 

Выход

Я так * сердится * на * ее *

Я так разозлилась на HER

1

Попробуйте это.

static Pattern EMP_PAT = Pattern.compile("\\*([^*]*)\\*|([^*]*)"); 

public static String emphasize(String s) { 
    StringBuilder sb = new StringBuilder(); 
    Matcher m = EMP_PAT.matcher(s); 
    while (m.find()) 
     sb.append(m.group(1) != null ? m.group(1).toUpperCase() : m.group(2)); 
    return sb.toString(); 
} 
Смежные вопросы