Необязательный литерал конца строки $ (не жадный)

Я хотел бы сделать символ «конец строки» ($) «необязательным» (или нежадным). Это означает, что я хочу захватить определенный шаблон в конце строки или ничего. Это регулярное выражение, которое я построил:

(.+\s*)\s*(?:(\(\s*[xX\*]\s*\d+\s*\))|$)

Я хотел бы захватить такие вещи, как

Incompatible device (x10) ; Boot sequence aborted

Я бы хотел, чтобы здесь была возможность захватить первую строку (Несовместимое устройство (x10)), но если квантификатор (x10) не появляется, чтобы иметь возможность захватить только второй (последовательность загрузки прервана, без (x##) после него). если я протестирую образец на

boot sequence aborted

Однако он захвачен, если я проверю его на всей строке выше, все захвачено, и мне нужна только часть «Несовместимое устройство».


person Hummus    schedule 12.02.2015    source источник
comment
Вы имеете в виду этот regex101.com/r/sY4uC9/2?   -  person Avinash Raj    schedule 12.02.2015


Ответы (1)


Вы очень близки: все, что вам нужно, это заменить ., который соответствует любому символу, на [^;], например:

([^;]+\s*)\s*(?:(\(\s*[xX\*]\s*\d+\s*\))|$)

Теперь ваше выражение будет захватывать первую часть, если присутствует (x10) (демонстрация), или вторую часть, если она отсутствует (демонстрация).

person Sergey Kalinichenko    schedule 12.02.2015
comment
Спасибо, это почти хорошо, это работает, но у меня есть ошибки, когда фраза содержит скобки. например, если строка для сопоставления: Incompatible device (connection error) (x3), то число не фиксируется как группа (потому что после него нет символа ';'). Любые идеи о том, как решить эту проблему? - person Hummus; 15.02.2015
comment
@AndroidNewbie Добавьте неохотный квалификатор после [^;]+, то есть сделайте его [^;]+?. - person Sergey Kalinichenko; 15.02.2015