Как использовать оператор «и» в Regex в Java - PullRequest
0 голосов
/ 23 июня 2018
package com.javaprograms;

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Remove_Elements_From_String {

    public static void main(String[] args) {

        String str = "Test123 is12 good123";

        int total = 0;

        Pattern p = Pattern.compile("[a-zA-Z]");
        String[] m = p.split(str);

        for (String s : m) {
            System.out.println(s.toString());
            int num = Integer.parseInt(s);
            total = total + num;
        }

        System.out.println("Total of above string is:" + total);
    }
}

Я ищу вывод типа 123+12+123=258, но он также печатает пробельные символы. Как игнорировать эти пробельные символы с помощью регулярных выражений. Любая помощь будет оценена. Я знаю, что мы можем использовать оператор "и" в регулярном выражении, но не знаю, как использовать, будучи новичком в регулярном выражении

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Разновидностью «использовать разделение и проверка на ноль» является использование потоков и filter.

public class RegexNumOnly {
   public static void main( String[] args ) {
      String test = "Test123 is12 good443";
      String[] tokens = test.split( "[a-zA-Z\\s]+" );
      System.out.println( Arrays.toString( tokens ) );
      System.out.println( Arrays.stream( tokens ).filter( s -> !s.isEmpty() )
              .mapToInt( Integer::parseInt ).sum() );
   }
}

Мне нравится, что YCF matcher().results() создает поток, я не знал, что Matcher сделает это.

0 голосов
/ 23 июня 2018

Просто чтобы ответить на вопрос «или», вы просто используете |, и тогда ваш шаблон будет иметь вид:

Pattern.compile("([a-z]|[A-Z])+")

+ в 1-n раз больше.

Проблема здесь в том, что ваша первая строка будет пустой, так как она будет разделена, потому что она находит шаблон, но левая часть шаблона пуста.

Делать так, как предложил YCF_L, определенноспособ пройти, так как вы ищете цифры, а не для остальных.Как правило, вы всегда должны применять шаблон к тому, что вы ищете, или вы в конечном итоге исключаете юниверс только для того, чтобы получить набор из 10 чисел.

0 голосов
/ 23 июня 2018

Вы можете использовать Matcher с этим регулярным выражением \d+, чтобы сопоставлять только цифры вместо разделения, ваш код может выглядеть следующим образом:

String str = "Test123 is12 good123";
int total = 0;
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while (m.find()) {
    total += Integer.parseInt(m.group());
}
System.out.println("Total of above string is: " + total);//Total of above string is: 258

Если вы используете Java9 +, вы можете просто использовать:

String str = "Test123 is12 good123";
int total = Pattern.compile("\\d+").matcher(str)
        .results()
        .mapToInt(m -> Integer.valueOf(m.group())).sum();

Если вы настаиваете на использовании split, вы можете использовать это регулярное выражение [^\d]+, которое будет соответствовать всем не цифрам, но вам все равно нужно проверить, не содержит ли массив пустые значения, ваш код может выглядеть следующим образом:

String str = "Test123 is12 good123";
int total = 0;
String[] m = str.split("[^\\d]+");
for (String s : m) {
    if (!s.equals("")) {
        total += Integer.parseInt(s);
    }
}
System.out.println("Total of above string is:" + total);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...