Выражение регулярного выражения с буквами перед - PullRequest
2 голосов
/ 10 июня 2019

Я хотел бы добавить «!» Перед моим выражением регулярного выражения.У меня есть:

TASK PERS asdf

PERS asdf

, и я хотел бы использовать регулярное выражение и получить

! TASK PERS asdf

! PERS asdf

, и я не знаю, как написать выражение регулярного выражения :( Я пытался много раз, ...но я потерпел неудачу, вы можете мне помочь, пожалуйста?

java

newContent = content.replaceAll("[A-Z]*TASK PERS", "!TASK PERS")

Но это не работает.

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Одним из возможных решений является сопоставление начала строки ^ MULTILINE флагом (?m)) и затем проверка, если после него есть PERS или TASK PERS. Мы можем сделать это с положительным прогнозом (?=...), который не помещает сопоставленный им текст в соответствие всему регулярному выражению, поэтому PERS или TASK PERS не будут изменены.

Итак, ваш код может выглядеть так:

//                                ┌ enable MULTILINE option
//                                |  ┌ match start of the line
//                                |  | ┌ ensure that there is PERS|TASK PERS 
//                                ↓  ↓ ↓ after it (after start of the line)
newContent = content.replaceAll("(?m)^(?=PERS|TASK PERS)", "!");
//                                                          ↑
//                                    we can use only ! because `PERS|TASK PERS` 
//                                    will not be part of match so it will 
//                                              not be replaced
1 голос
/ 10 июня 2019

Вы можете использовать совпадение с необязательной частью (?:TASK )? для ЗАДАЧИ, за которым следует пробел и заменить на ! и совпадение. Добавьте пробел, если вы также хотите, чтобы в замене.

Как отметил Пшемо в своем комментарии, вы должны использовать флаг Multiline . Или используйте (?m) в качестве модификатора в начале шаблона.

newContent = content.replaceAll("^(?:TASK )?PERS\b", "!$0");

^(?:TASK )?PERS\b

Regex demo

1 голос
/ 10 июня 2019

Методы не-регулярного выражения были бы намного лучше для этой задачи, но если мы хотим сделать с выражением, это, вероятно, сработает:

(TASK PERS|PERS)(.*)

и заменит его на ! $1$2

Демо

Тест

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

final String regex = "(TASK PERS|PERS)(.*)";
final String string = "TASK PERS asdf\n"
     + "PERS asdf\n"
     + "TASK PERS asdf\n"
     + "PERS asdf";
final String subst = "! \\1\\2";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

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