2015-10-15 4 views
0

Я пытался исправить простое регулярное выражение, которое:Regex: Можно ли пропустить повторяющиеся отрицательные искажения?

  1. Похожее все символы из начала строки (^) на первый & характер или до конца строки ($).
  2. Встреча не начинается с &.

Примеры:

  1. testtest должен соответствовать.
  2. one&two должно соответствовать one.
  3. &test не должно соответствовать ни одному.

Мой текущий регулярное выражение выглядит следующим образом:

^(?<!\&)(.+?)(?=\&|$) 

(Regex101)


В настоящее время это регулярное выражение не удается пример 3, где, если я дал это регулярное выражение &test он соответствует &test, но это ничего не должно соответствовать.

Я думаю, что это может быть проблема с отрицательным (?<!\&) и назад ', что &test матчи, потому что символ перед ним не &, но он не учитывает каких-либо следующих & символов.

Изменяет отрицательный lookbehind на счет повторения & символов, и если да, то как я могу исправить это регулярное выражение?


(я знаю, что Regex101 использует Regex Python, но Regex на этот вопрос является предназначен для работы с Java.)

ответ

3

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

^[^&]+ 

См demo (обратите внимание, что \n добавляется только для демы, если вы тестируете строки без перевода строки символов, это не будет необходимо).

Здесь ^ утверждает положение в начале строки, а [^&]+ класса соответствует 1 или более другим, чем символам & (таким образом, нет необходимости использовать (?=\&|$) смотреть вперед, в случае необходимости, вся линия будет соответствовать) ,

См IDEONE demo

public static void main (String[] args) throws java.lang.Exception 
{ 
    System.out.println(fetchMatch("test", 0)); 
    System.out.println(fetchMatch("one&test", 0)); 
    System.out.println(fetchMatch("&test", 0)); 
} 
public static String fetchMatch(String s, int groupId) 
{ 
    Pattern pattern = Pattern.compile("^[^&]+"); 
    Matcher matcher = pattern.matcher(s); 
    if (matcher.find()){ 
     return matcher.group(groupId); 
    } 
    return "ERROR: NOT MATCHED"; 
} 

Выход:

test 
one 
ERROR: NOT MATCHED 
+0

ах, негативный класс символов, как бы я не знал бы такая вещь? – octopod

+0

Собственно, правда @RealSkeptic. Это уже запрещено. Мои мозги теперь работают линейно, как механизм регулярных выражений :) Если мы храним '(. +?)', Тогда требуется '(?! &)'. Вот что я имел в виду. –

Смежные вопросы