Расщепленная строка на основе паратезов - PullRequest
1 голос
/ 23 марта 2020

Я пишу Scala код, который разбивает строку на основе двоеточия (:). Например, для ввода, которое выглядело так:

sparker0i@outlook.com : password

Я делал line.split(" : ") (что по сути Java) и печатал электронную почту и пароль на консоли.

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

(sparker0i@outlook.com,sparker0i) : password

Я хочу отдельно напечатать email , имя пользователя и пароль отдельно .

Я попробовал Regex, сначала пытаясь разделить парантезы, но это не сработало, потому что это не правильно (val lt = line.split("[\\\\(||//)]")). Пожалуйста, направьте меня с правильными логами регулярных выражений / split c.

Ответы [ 4 ]

4 голосов
/ 23 марта 2020

Я не пользователь scala, но вместо разделения я думаю, что вы можете использовать Pattern и matcher для извлечения этой информации, ваше регулярное выражение может использовать такие группы, как:

\((.*?),(.*?)\) : (.*)

regex demo

Затем вы можете извлечь группу 1 для электронной почты, группу 2 для имени пользователя и третью группу для пароля.

val input = "(sparker0i@outlook.com,sparker0i) : password"
val pattern = """\((.*?),(.*?)\) : (.*)""".r
pattern.findAllIn(string).matchData foreach {
   m => println(m.group(1) + " " + m.group(2) + " " + m.group(3))
}

Кредит для этого сообщения { ссылка }

1 голос
/ 23 марта 2020

В scala 2.13 существует простое решение без regrex:

Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 1.8.0_222).
Type in expressions for evaluation. Or try :help.

scala> val input = "(sparker0i@outlook.com,sparker0i) : password"
input: String = (sparker0i@outlook.com,sparker0i) : password

scala> val s"($mail,$user) : $pwd" = input
mail: String = sparker0i@outlook.com
user: String = sparker0i
pwd: String = password
1 голос
/ 23 марта 2020

Я бы использовал регулярное выражение:

\((.*?),([^)]+)\) : (.+)

Демо-версия регулярного выражения

\(        # Matches (
(         # Start of capture group 1
   (.*?)  # Capture 0 or more characters until ...
)         # End of capture group 1
,         # matches ,
(         # start of capture group 2
   [^)]+  # captures one or more characters that are not a )
)         # end of capture group 2
\)        # Matches )
 :        # matches ' : '
(         # start of capture group 3
   (.+)   # matches rest of string
)         # end of capture group 3

Реализация Java будет выглядеть так:

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

public class Test
{

    public static void main(String[] args) {
        String s =  "(sparker0i@outlook.com,sparker0i) : password";
        Pattern pattern = Pattern.compile("\\((.*?),([^)]+)\\) : (.+)");
        Matcher m = pattern.matcher(s);
        if (m.matches()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
            System.out.println(m.group(3));
        }
    }
}

Отпечатки:

sparker0i@outlook.com
sparker0i
password

Java Демо

0 голосов
/ 23 марта 2020

это без особых изменений

    String s =  "(sparker0i@outlook.com,sparker0i) : password";
    // do whatever you were doing 
    String[] sArr = s.split(":");
    sArr[0] = sArr[0].replaceAll("[(|)]","");  // just replace those parenthesis with empty string
    System.out.println(sArr[0] + " " + sArr[1]);

Вывод

sparker0i@outlook.com,sparker0i   password
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...