Scanner.findall () и Matcher.Results () Работайте по -разному для того же входного текста и шаблонаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Scanner.findall () и Matcher.Results () Работайте по -разному для того же входного текста и шаблона

Сообщение Anonymous »

Я видел эту интересную вещь во время разделения строки свойств с использованием regex. Я не могу найти основную причину. < /p>

У меня есть строка, которая содержит текст, подобный свойствам Key = value pare.
У меня есть повторное выражение, которое разделяет строку на клавиши /значения на основе позиции = < /strong>. Он рассматривает первое = как точка разделения. Значение также может содержать = в нем. < /P>

Я попытался использовать два разных способа в Java для этого. < /p>


Использование scanner.findall () < /strong> метод < /p>

Это не ведет себя так, как ожидалось. Он должен извлечь и распечатать все ключи на основе шаблона. Но я нашел его поведение странным. У меня есть одна пара клавиш, как ниже < /p> < /li>
< /ol>

Код: Выделить всё

    SectionError.ErrorMessage=errorlevel=Warning {HelpMessage:This is very important message This is very important .....}
Ключ, который следует извлечь, - это sectionerror.errormessage = [/b], но он также рассматривает errorlevel = как ключ. КЛЮЧ. Нет проблем, что мы вкладываем в строку свойств. < /P> < /li>
< /ol>

Пример кода я попробовал: < /p>

import java.util.Scanner;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.MULTILINE;

public class MessageSplitTest {

static final Pattern pattern = Pattern.compile("^[a-zA-Z0-9._]+=", MULTILINE);

public static void main(String[] args) {
final String properties =
"SectionOne.KeyOne=first value\n" + // removing one char from here would make the scanner method print expected keys
"SectionOne.KeyTwo=second value\n" +
"SectionTwo.UUIDOne=379d827d-cf54-4a41-a3f7-1ca71568a0fa\n" +
"SectionTwo.UUIDTwo=384eef1f-b579-4913-a40c-2ba22c96edf0\n" +
"SectionTwo.UUIDThree=c10f1bb7-d984-422f-81ef-254023e32e5c\n" +
"SectionTwo.KeyFive=hello-world-sample\n" +
"SectionThree.KeyOne=first value\n" +
"SectionThree.KeyTwo=second value additional text just to increase the length of the text in this value still not enough adding more strings here n there\n" +
"SectionError.ErrorMessage=errorlevel=Warning {HelpMessage:This is very important message This is very important message This is very important messageThis is very important message This is very important message This is very important message This is very important message This is very important message This is very important message This is very important message This is very important messageThis is very important message This is very important message This is very important message This is very important message This is very important message}\n" +
"SectionFour.KeyOne=sixth value\n" +
"SectionLast.KeyOne=Country";

printKeyValuesFromPropertiesUsingScanner(properties);
System.out.println();
printKeyValuesFromPropertiesUsingMatcher(properties);
}

private static void printKeyValuesFromPropertiesUsingScanner(String properties) {
System.out.println("===Using Scanner===");
try (Scanner scanner = new Scanner(properties)) {
scanner
.findAll(pattern)
.map(MatchResult::group)
.forEach(System.out::println);
}
}

private static void printKeyValuesFromPropertiesUsingMatcher(String properties) {
System.out.println("===Using Matcher===");
pattern.matcher(properties).results()
.map(MatchResult::group)
.forEach(System.out::println);

}
}

< /code>

Печата вывода: < /p>

===Using Scanner===
SectionOne.KeyOne=
SectionOne.KeyTwo=
SectionTwo.UUIDOne=
SectionTwo.UUIDTwo=
SectionTwo.UUIDThree=
SectionTwo.KeyFive=
SectionThree.KeyOne=
SectionThree.KeyTwo=
SectionError.ErrorMessage=
errorlevel=
SectionFour.KeyOne=
SectionLast.KeyOne=

===Using Matcher===
SectionOne.KeyOne=
SectionOne.KeyTwo=
SectionTwo.UUIDOne=
SectionTwo.UUIDTwo=
SectionTwo.UUIDThree=
SectionTwo.KeyFive=
SectionThree.KeyOne=
SectionThree.KeyTwo=
SectionError.ErrorMessage=
SectionFour.KeyOne=
SectionLast.KeyOne=
< /code>

Что может быть основной причиной этого? Работает ли Scanner findall иначе, чем Matcher ?


Подробнее здесь: https://stackoverflow.com/questions/623 ... t-text-and
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Java в C# не может перевести код (Matcher.group() и Matcher.replaceFirst)
    Anonymous » » в форуме C#
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Как получить только первую строку, соответствующую корпорации в Java с помощью Matcher Matcher?
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Извлеките строковый компонент в хранение в виде ключа хэш -карты в функции, Matcher Matcher?
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Matcher Matcher regex regex для идентификации необычных персонажей и азиатских идеографий
    Anonymous » » в форуме JAVA
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Java Regex Matcher Matcher Замените группу на повторение
    Anonymous » » в форуме JAVA
    0 Ответы
    0 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»