java 6 replaceall replacefirst - PullRequest
       0

java 6 replaceall replacefirst

0 голосов
/ 26 сентября 2010

Следующее регулярное выражение работает при использовании в string.replaceall (), но не в случае string.replaceFirst ().

String:

TEST|X||Y|Z||

Ожидаемый результат:

TEST|X|**STR**|Y|Z||

Регулярное выражение:

  string.replaceAll( "(TEST\\|[\\|\\|]*\\\\|)\\|\\|", "$1|ST|" );


Output (not desired):


 TEST|X|**STR**|Y|Z|**STR**|


string.replaceFirst( "(TEST\\|[\\|\\|]*\\\\|)\\|\\|", "$1|ST|" );

В строку не вносятся никакие изменения.

Пожалуйста, помогите!

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2010

Если вы хотите заменить только первый "||" с помощью "| ST |" вы можете сделать это:

System.out.println("TEST|X||Y|Z||".replaceFirst("\\|\\|", "|ST|"));
0 голосов
/ 26 сентября 2010

Ваше регулярное выражение, вероятно, не выполняет то, что вы ожидаете.Причина в том, что символ трубы | имеет два значения.Это ваш разделитель, а также ИЛИ в регулярном выражении.

(TEST\\|[\\|\\|]*\\\\|)\\|\\|

Вы эффективно ищете ТЕСТ и т. Д. ИЛИ ||и совпадают оба || s

Если вы пытаетесь сопоставить только ||после ТЕСТА | Х |Вы можете использовать

"(TEST\\|[^\\|]*)\\|\\|"

TEST, за которым следует труба, затем ноль или более нетруб, за которыми следуют две трубы

0 голосов
/ 26 сентября 2010

Ваш вопрос не очень понятен, но я предполагаю, что вы спрашиваете, почему есть разница в выводе. Найдено два совпадения для шаблона регулярного выражения, который вы передали в строке. Поэтому, когда вы сказали replaceAll, оба совпадения были заменены, а при использовании replaceFirst заменяется только первое. Отсюда и разница в выходе. Чтобы найти совпадения -

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

public class Regex {

    public static void main(String[] args) {

        String string1 = new String("TEST|X||Y|Z||");           

        Pattern pattern = Pattern.compile("(TEST\\|[\\|\\|]*\\\\|)\\|\\|");
        Matcher matcher = pattern.matcher(string1);

        boolean found = false;
        while (matcher.find()) {
            System.out.printf("I found the text \"%s\" starting at "
                    + "index %d and ending at index %d.%n", matcher.group(),
                    matcher.start(), matcher.end());
            found = true;
        }
        if (!found) {
            System.out.printf("No match found.%n");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...