RegEx matcher всегда возвращает false - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь разобрать строку, подобную этой;

/ ^ / ^ это большой | / * это жирный текст | / - это удар через |мне нужен текст между $ / ^ и $ |

Проверено регулярное выражение в регулярное выражение и тестер регулярных выражений Java , и оба они показывают его работу.

Также ссылается на: Java regex matcher всегда возвращает false и Regex, который всегда возвращает false

Сравнил мой код с Учебник по Java Regex включенJenkov , и похоже, что он похож на

Мой код

 public static final String bold = "/\\/\\*(.*?)\\|/g";
    public static final String strike = "/\\/\\-(.*?)\\|/g";
    public static final String big = "/\\/\\^(.*?)\\|/g"; 


    String input = "/^/^this is a big|/*this is a bold text|/-this is strike through|";

    SpannableStringBuilder str = new SpannableStringBuilder(input.trim());
    Pattern pattern = big;
    Matcher matcher = pattern.matcher(str.toString());

            while (matcher.find()) {
                  str.setSpan(new RelativeSizeSpan((1.25f)),
                        matcher.start(), matcher.end(),
                        SPAN_INCLUSIVE_INCLUSIVE);
                //input.replace(matcher.group(1),"");
            }

, поэтому matcher.find() возвращает значение false и matcher.groups() тоже нет.Я действительно понятия не имею, где я здесь проскальзываю.

EDIT

Pattern pattern = Pattern.compile(big);

Я забыл добавить эту часть, так как само регулярное выражение было возвращено из другой функции, которая возвращает уже скомпилированный шаблон,Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 16 февраля 2019
    Pattern pattern = Pattern.compile("/\\^(.*?)\\|");

    String input = "/^/^this is a big|/*this is a bold text|/-this is strike through|";
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        System.out.println("Found: " + matcher.group(1));
    }
    System.out.println("That’s all, folks");

Вывод:

Found: /^this is a big
That’s all, folks

Если вы хотите удалить текст между /^ и |, используйте идиому, приведенную в документации Matcher.appendReplacement():

    StringBuilder sb = new StringBuilder();
    while (matcher.find()) {
        matcher.appendReplacement(sb, "/^|");
    }
    matcher.appendTail(sb);
    System.out.println(sb.toString());  
/^|/*this is a bold text|/-this is strike through|

Почему ваш код не работал?

Посмотрите внимательнее на учебник Jenkov.Он имеет следующую строку кода:

    String patternString = "is";

Шаблон не начинается с / и не заканчивается /g.Таким образом, включив эти части, вы требуете их включения в соответствующий текст.Так как они не были в вашей входной строке, ваш шаблон не может соответствовать.Также в вашем коде отсутствовал звонок на Pattern.compile.Именно в этой строке кода в учебнике:

    Pattern pattern = Pattern.compile(patternString);

Ссылка: документация Matcher.appendReplacement()

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