Использование положительного прогнозирования в java matchig - PullRequest
0 голосов
/ 10 мая 2018

У меня есть задача, в которой мне нужно проанализировать некоторые данные и перенести их в другой столбец.И в некоторых случаях мне нужно заменить некоторые детали в зависимости от условий.

Я прочитал, что java Pattern / Matcher поддерживает операции упреждения / опережения (или группировки, я не знаю, как именно это называется).

Так, например, у меня есть такая строка 100 K, и я хочу преобразовать ее в 100000

Я использовал такой шаблон: (?i)(?=[0-9]+)\s*[k]\b

Matcher m = Pattern.compile("(?i)(?=[0-9]+)\\s*[k]\\b").matcher("100 K");
if(m.find()){
    System.out.println(m.start());
    return;
}
System.out.println("false");

В результате я всегда получаю false.И я ожидал увидеть 3.Если я изменю шаблон на (?i)([0-9]+)\\s*[k]\\b и использую операцию точного совпадения (matches), тогда я вижу true, и если я изменяю шаблон на отрицательный прогноз (?i)(?![0-9]+)\\s*[k]\\b, тогда find () возвращает true, а start () возвращает3.

Вопрос в том, допустил ли я ошибку в паттерне или использовал ее неправильно?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вам не нужно смотреть в будущее для этого.То, как вы это написали, ищет что-то с последующим 0-9 (а не 0-9 с последующим k), а затем хочет пробелы и ak, что не может произойти, чтобы соответствовать первой части, там должно бытьтам цифры - не пробелы и ак сразу.

(?i)1(?=[0-9]+)([0-9]+)\s*[k]\b  

или

(?i)([0-9]+)(?=\s*[k])\b

будет соответствовать, но это не то, что вам нужно, поскольку вы хотите заменить "k".Вы можете сделать это с помощью захвата групп.Ваша отрицательная попытка упреждения на самом деле возвращает нужный вам индекс, но странным образом - он ищет что-то, за чем не следует число, а это пробел (ы) + k.Это на самом деле не требует цифр.

(?i)([0-9]+)(\s*[k])\b   

поймает «k» во второй группе.Тогда вы можете использовать:

m.replaceFirst(m.group(1) + "000")
0 голосов
/ 10 мая 2018

Проще говоря, все, что вам нужно найти, это цифры, за которыми следует (K или k)

Регулярное выражение: \ d {1,} \ s * [Kk]

Matcher m = Pattern.compile("\\d{1,}\\s*[Kk]").matcher("100 K");
if(m.find()){
    System.out.println(m.start());
    return;
}
System.out.println("false");

start () получит индекс первого совпадения символа

...