JAVA регулярное выражение, чтобы найти строку - PullRequest
0 голосов
/ 01 июня 2018

У меня есть такая строка:

font-size:36pt;color:#ffffff;background-color:#ff0000;font-family:Times New Roman;

Как мне получить значение цвета и значение background-color?

color: #ffffff;

background-color: # ff0000;

Я пробовал следующий код, но результат не мой ожидаемый.

Pattern pattern = Pattern.compile("^.*(color:|background-color:).*;$");

Результат будет отображаться:

font-size:36pt; color:#ffffff; background-color:#ff0000; font-family:Times New Roman;

Ответы [ 5 ]

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

Используйте синтаксический анализатор CSS, например ph-css

String input = "font-size:36pt; color:#ffffff; background-color:#ff0000; font-family:Times New Roman;";
final CSSDeclarationList cssPropertyList = 
    CSSReaderDeclarationList.readFromString(input, ECSSVersion.CSS30);
    System.out.println(cssPropertyList.get(1).getProperty() + " , "
            + cssPropertyList.get(1).getExpressionAsCSSString());
    System.out.println(cssPropertyList.get(2).getProperty() + " , "
            + cssPropertyList.get(2).getExpressionAsCSSString());

Отпечатки:

color , #ffffff
background-color , #ff0000

Узнайте больше о ph-css на github

0 голосов
/ 01 июня 2018
Pattern pattern = Pattern.compile("color\\s*:\\s*([^;]+)\\s*;\\s*background-color\\s*:\\s*([^;]+)\\s*;");
Matcher matcher = pattern.matcher("font-size:36pt; color:#ffffff; background-color:#ff0000; font-family:Times New Roman;");
if (matcher.find()) {
    System.out.println("color:" + matcher.group(1));
    System.out.println("background-color:" + matcher.group(2));
}
0 голосов
/ 01 июня 2018

Нет необходимости описывать весь ввод, только соответствующие части, которые вы хотите извлечь.

Регулярное выражение color:(#[\\w\\d]+); помогает мне:

String input = "font-size:36pt;color:#ffffff;background-color:#ff0000;font-family:Times New Roman;";
String regex = "color:(#[\\w\\d]+);";
Matcher m = Pattern.compile(regex).matcher(input);
while (m.find()) {
    System.out.println(m.group(1));
}

Обратите внимание, что m.group(1) возвращает соответствующую группу, которая в скобках в регулярном выражении.Таким образом, регулярное выражение на самом деле соответствует всем color:#ffffff; и color:#ff0000; частям, но печать обрабатывает только само число.

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

Если вы хотите, чтобы в строке было несколько совпадений, не утверждайте ^ и $, потому что, если эти совпадения совпадают, то совпадает вся строка, что означает, что вы не можете сопоставить ее снова.

Также используйте ленивый квантификатор, такой как *?.Это прекратит сопоставление, как только найдет некоторую строку, соответствующую шаблону после него.

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

(color:|background-color:)(.*?);

Группа 1 либо color:, либо background-color:, группа 2 - цветовой код.

Демо

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

Для этого вы должны использовать выражение (?!abc) в регулярном выражении.Это находит совпадение, но не выбирает его.После этого вы можете просто выбрать шестнадцатеричный код, например:

String s = "font-size:36pt;color:#ffffff;background-color:#ff0000;font-family:Times New Roman";

Pattern pattern = Pattern.compile("(?!color:)#.{6}");
Matcher matcher = pattern.matcher(s);

while (matcher.find()) {
    System.out.println(matcher.group());
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...