Соответствие Java регулярному выражению - PullRequest
1 голос
/ 09 июля 2010

сильный текст У меня есть несколько строк в текстовом файле, и я хочу сопоставить это ${ALPANUMERIC characters} и заменить его на ${SAME ALPHANUMERIC characters plus _SOMETEXT(CONSTANT)}.

Я попробовал это выражение ${(.+)}, но оно не сработало, и я также не знаю, как сделать регулярное выражение замены в Java.

спасибо за ваш отзыв

Вот мой код:

BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        StringBuilder sb = new StringBuilder();

        while ((line = br.readLine()) != null) {
            Pattern p = Pattern.compile("\\$\\{.+\\}");
            Matcher m = p.matcher(line); // get a matcher object
               if(m.find()) {
                   System.out.println("MATCH: "+m.group());
                   //TODO
                   //REPLACE STRING
                   //THEN APPEND String Builder
               }
            }               

ОК, это выше работает, но оно только находит мою переменную, а не всю строку для ex здесь мой ввод:

текст до ${VARIABLE_NAME} текст после
какой-то текст до ${VARIABLE_NAME2} какой-то текст после
часть текста перед текстом без переменной часть текста после
... и т. д.

, поэтому я просто хочу заменить ${VARIABLE_NAME} или ${VARIABLE_NAME} на ${VARIABLE_NAME2_SOMETHING}, но оставить предыдущую и следующую текстовую строку такой, как

EDIT:

Я думал, что так:

if(line.contains("\\${([a-zA-Z0-9 ]+)}")){
                    System.out.println(line);
                }

if(line.contains("\\$\\{.+\\}")){
                    System.out.println(line);
                }

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

РЕДАКТИРОВАТЬ II

Мне кажется, что я здесь ближе к решению, вот что я придумала до сих пор:

  if(line.contains("$")){
                    System.out.println(line.replaceAll("\\$\\{.+\\}", "$1" +"_SUFFIX"));
                }

Что я имел в виду $1 - это строка, которую вы только что нашли, замените ее на себя + _SUFFIX

Ответы [ 4 ]

1 голос
/ 09 июля 2010
line = line.replaceAll("\\$\\{\\w+", "$0_SOMETHING");

Нет необходимости проверять наличие $ или чего-либо еще; это часть того, что делает replaceAll(). В любом случае, contains() не поддерживает регулярные выражения, как find(); он просто выполняет обычный текстовый поиск.

1 голос
/ 09 июля 2010

Я бы использовал метод String.replaceAll () следующим образом:

`String old =" некоторые строковые данные ";

String new = old.replaceAll("$ ([a-zA-Z0-9] +)", "(\ 1) CONSTANT");`

1 голос
/ 09 июля 2010

РЕШЕНИЕ:

while ((line = br.readLine()) != null) {

                if(line.contains("$")){ 
                    sb.append(line.replaceAll("\\$\\{(.+)\\}", "\\${$1" +"_SUFFIX}") + "\n");
                }else{
                    sb.append(line + "\n");
                }

            }   
1 голос
/ 09 июля 2010

$ - это специальный символ регулярного выражения, представляющий конец строки. Вы должны будете избежать этого, чтобы соответствовать этому. Вам также потребуется экранировать обратную косую черту, которую вы используете для экранирования знака доллара, из-за того, как Java обрабатывает строки.

Если у вас есть текст в строке, вы сможете сделать следующее:

str.replaceAll("\\${([a-zA-Z0-9 ]+)}", "\\${$1 _SOMETEXT(CONSTANT)}")

Если в именах переменных есть другие символы (например, подчеркивание, символы и т. Д.), Просто добавьте их в класс символов, для которого вы подходите.

Редактировать : Если вы хотите использовать Pattern и Matcher, тогда еще есть несколько изменений. Во-первых, вы, вероятно, хотите скомпилировать ваш шаблон вне цикла. Во-вторых, вы можете использовать это, хотя это более многословно.

Pattern p = Pattern.compile("\\$\\{.+\\}");
Matcher m = p.matcher(line);
sb.append(m.replaceAll("\\${$1 _SOMETEXT(CONSTANT)}"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...