Я пытаюсь написать шаблон регулярного выражения, который не будет соответствовать, если предыдущий шаблон содержит любой символ, кроме чистого пробела, например
--hello (match)
--goodbye (match)
ROW_NUMBER() OVER (ORDER BY DATE) --date (fail)
--comment with some indentation (match)
--another comment with some indentation (match)
Самое близкое, что у меня есть, это этот шаблон, который я сделал (?<!.)--.*\n
, который дает мне этот результат
--hello (match)
--goodbye (match)
ROW_NUMBER() OVER (ORDER BY DATE) --date (fail)
--comment with some indentation (fail)
--another comment with some indentation (fail)
Я пробовал (?<!\s)--.*\n
и (?<=\S)--.*\n
, но оба не возвращают совпадений
Обновлено: regexr.com более четко иллюстрирует проблему regexr.com/6j0mt
Если вы просто пытаетесь проверить каждую строку, используйте: ^[ \t]*--
Ни один из этих шаблонов не помогает
Проверьте это: regexr.com/6j0nc
Аааа, я вижу, вы изменили флаги, чтобы включить многострочный /gm
, у меня был только глобальный /g
и, следовательно, он не работал.
Да, нам нужно использовать m
(MULTILINE), так как мы используем якорь ^
Итак, что работает для вас?
Все 3 в итоге заработали, просто нужно было добавить многострочный флаг, чтобы все заработало - спасибо обоим за вашу помощь.
Нет, не совсем возможно, первая будет работать в .NET и JavaScript, а версия с \K
будет работать в PCRE/Onigmo. Где вы используете регулярное выражение?
Я использую свой в Python с помощью модуля regex
, просто выбрал первый, который я выбрал, который является шаблоном (?<=^[^\S\r\n]*)
С PyPi regex
вы можете использовать
import regex
text = r"""--hello
--goodbye
ROW_NUMBER() OVER (ORDER BY DATE) --date
--comment with some indentation
--another comment with some indentation"""
print( regex.findall(r'(?<=^[^\S\r\n]*)--.*', text, regex.M) )
# => ['--hello', '--goodbye', '--comment with some indentation', '--another comment with some indentation']
См. этот Демонстрация Python онлайн.
Или с Python по умолчанию re
:
import re
text = r"""--hello
--goodbye
ROW_NUMBER() OVER (ORDER BY DATE) --date
--comment with some indentation
--another comment with some indentation"""
print( re.findall(r'^[^\S\r\n]*(--.*)', text, re.M) )
Детали узора
(?<=^[^\S\r\n]*)
- положительный просмотр назад, который соответствует местоположению, которому непосредственно предшествует начало строки/строки и ноль или более горизонтальных пробелов^
- начало строки (здесь строка, т.к. используется опция re.M
/ regex.M
)[^\S\r\n]*
- ноль или более символов, кроме символов без пробелов, символов CR и LF (любые пробелы, кроме символов возврата каретки и символов перевода строки)(--.*)
- Группа 1: --
и остальная часть строки (.*
соответствует как можно большему числу символов, отличных от символов разрыва строки).
Попробуйте
(?<=^[^\S\r\n]*)--.*
или^\h*\K--.*
. Или просто используйте^[^\S\r\n]*(--.*)
и получите значение группы 1.