@an1mak

Как усовершенствовать код, чтобы можно было работать со знаками препиания?

Суть задания: Заменить в тексте все слова длиной не больше 6 символов в обратном порядке, начинающиеся
на согласную букву.

Написал код, который работает с пробелами, однако как работать с другими знаками препинания понятия не имею, буду благодарен любой помощи

public class Main 
{
	public static void main (String[] args)
	{
		char[] cons = {'б','в','г', 'д','ж','й','з','к','л','м','н','п','р','с','т','ф','ч','х','ц','ш','щ'};	
		int sovp = 0;
		String task = "Заменить в тексте все слова длиной не больше 6 символов в обратном порядке начинающиеся на согласную букву ";
		task = task.toLowerCase();
		System.out.println(task);		
		String[] strArr = task.split(" ");
		
		for (int i=0;i<strArr.length;i++)
		{
			char first = strArr[i].charAt(0);		
			for (int a= 0; a < 21; a++)
			{
				if (first == cons[a])
				{
					sovp = 1;
				}
			}
			if ((strArr[i].length() <= 6) && (sovp==1))
			{
				StringBuffer sBuffer = new StringBuffer(strArr[i]);
				sBuffer.reverse();
				System.out.print(sBuffer + " ");
				sovp = 0;
			}
			else
				System.out.print(strArr[i] +" ");
		}
	}
}
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
Erik_Mironov
@Erik_Mironov
Старые вопросы: *Dies from cringe*
Вы можете использовать просмотр вперед и просмотр назад, которые являются функциями регулярных выражений.
Вы даже можете поместить плейсхолдеры, например %1$s и использовать String.format для замены плейсхолдеров на фактическую строку, которую вам нужно использовать.

Простое решение для Java 8 и новее:

public class Main {
    public static final String DELIMITER = "((?<=%1$s)|(?=%1$s))";

    public static void main(String[] args) {
        String task = "Заменить, в тексте все! слова длиной? не больше 6 символов; в обратном порядке начинающиеся на: согласную букву ";
        String[] arr = task.split(String.format(DELIMITER, "[:?;!. ]"));
        String result = Arrays.stream(arr)
                .map(s -> !check(s.charAt(0)) && !length(s) ? reverse(s) : s)
                .collect(Collectors.joining());
        System.out.println(result); /* Заменить, в етскет есв! аволс йонилд? ен ешьлоб 6 символов; в обратном порядке начинающиеся ан: согласную увкуб */

    }

    public static boolean check(char c) {
        return "аиеёоуыэюя".indexOf(c) > -1;
    }

    public static boolean length(String s) {
        return s.length() > 6;
    }

    public static String reverse(String s) {
        return new StringBuilder(s).reverse().toString();
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы