2016-07-29 3 views
1

Моего Regex:Не жадное регулярное выражение не работает

\@((TIME|NOW|TODAY)\(.*?\)\s+[0-2]?[0-9]:[0-5][0-9]:[0-5][0-9]) 

Моя строка:

@Time blah blah @TIME(1d) blah @NOW(12312) 12:32:25 blah @TODAY(12312) 12:32:25 

Что я ожидаю, чтобы соответствовать:

@NOW(12312) 12:32:25 
+0

Если вам нужно соответствовать только '@Now (12312) 12: 32: 25', вам нужно только ['@NOW \ ([0-9] + \) \ s + [0-9:] +'] (https://regex101.com/r/nM7nP1/1). –

ответ

1

Использовать отрицание класса символов вместо .* :

@((TIME|NOW|TODAY)\([^@]*?\)\s+[0-2]?[0-9]:[0-5][0-9]:[0-5][0-9]) 

RegEx Demo

[^@]* будет соответствовать 0 или более любых символов, которые не @, таким образом, не соответствует какой-либо другой строки, начиная с @.

Если есть возможность иметь @ в вашей совпавшей строки, то вы можете использовать отрицательное опережения регулярное выражение на основе:

@((?:TIME|NOW|TODAY)\((?:([email protected](?:TIME|NOW|TODAY)).)*\)\s+[0-2]?[0-9]:[0-5][0-9]:[0-5][0-9]) 

RegEx Demo2

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