Как отменить звездочку в регулярном выражении Java?

Я пытаюсь создать регулярное выражение, которое помогает поиску Eclipse найти все строки, содержащие start(, за исключением тех, которые являются строками комментариев.

То есть найти строки типа:

 is not sufficient because it doesn't guarantee that start(b) is 

Но не такие строки, как:

 * is not sufficient because it doesn't guarantee that start(b) is

Мне удалось найти регулярное выражение (\s*?)(?!\*)(.*)(start\()(.*$), но оно находит обе строки.

Как исключить строку, начинающуюся с * (возможно, после некоторого пробела), и включить строки, в которых этого нет?


person srf    schedule 14.08.2012    source источник


Ответы (3)


Для строки, начинающейся с пробела, возможно, что \s*? соответствует нулю пробелов, затем (?!\*) соответствует пробелу, а концевой конец .* соответствует остальной части строки, включая звездочку.

Решением было бы поместить преамбулу с начальными пробелами внутри предложения с отрицанием:

^(?!\s*\*).*start\(.*$

В качестве альтернативы вы можете использовать притяжательный квантификатор, чтобы съесть все пробелы и никогда не возвращаться:

^\s*+(?!\*).*start\(.*$
person bobince    schedule 14.08.2012
comment
^(?!\s*\*).*start\(.*$ работает. Он даже выдает совпадение (в дополнение к найти, которого нет в форме [^\*] ниже). +1 уже. - person srf; 15.08.2012
comment
То же самое для ^\s*+(?!\*).*start\(.*$. - person srf; 15.08.2012

^\s*+(?=[^\*]).*?start\(

^ это начало строки

\s*+ жадно потребляет пробелы

(?= — это поиск вперед — он соответствует позиции, но не тексту. Это позволяет тому, что вы ищете, быть первым на линии.

[^\*] — любой символ, не являющийся *

) завершить просмотр вперед

.*? ленивый сопоставить любой старый хлам

start\( или что еще вы хотите найти

person Andrew    schedule 14.08.2012
comment
Этот работает. Я только что проверил это. Я думаю, что мне не хватало [^\*] (против (?!\*)). Мне нужно узнать больше об этом. +1 на данный момент, так как похоже, что есть несколько хороших ответов, но я могу принять только один. - person srf; 15.08.2012

Я бы попробовал это ^\s*[^\*]+.*start\(.*$

person gpeche    schedule 14.08.2012
comment
Это требует небольшой работы. Пробелы должны быть добавлены к инвертированному классу символов, чтобы он не мог вернуться к ведущим пробелам. Звездочки в другом месте строки, по-видимому, допустимы, поэтому + будет излишним... угловым случаем будет строка, начинающаяся с start(. Чтобы обойти это, вы можете использовать ^\s*([^*\s].*)?start\(.*$. - person bobince; 15.08.2012
comment
Извините, но это дает те же (неправильные) результаты, что и мой (\s*?)(?!\*)(.*)(start\()(.*$). Хотя спасибо за попытку. - person srf; 15.08.2012