Почему у моего регулярного выражения странное поведение? Это ошибка? - PullRequest
1 голос
/ 20 октября 2019

У меня есть некоторые проблемы с моим регулярным выражением. Я хотел бы получить строку перед комментарием. Эта строка может быть заключена в кавычки или нет.

Если я добавлю # (комментарий) в кавычки, я хочу, чтобы это была строка, а не комментарий.

Вот мойрегулярное выражение:

[\"']?(.*?)[\"']?\s*(#.*)

Вот несколько функциональных примеров с этим регулярным выражением:

"test" # comment    ---> group1: test   group2: # comment
test # comment      ---> group1: test   group2: # comment

Вот с чем у меня проблемы, и я не понимаю:

"t#est" # comment   ---> group1: t      group2: #est" # comment

Я хочу group1: t#est group2: # comment

Мое регулярное выражение с Regex1O1

Заранее благодарю за помощь.

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Вы сделали открывающие / закрывающие кавычки необязательными, но не согласованы. Они либо должны быть там, либо ни того, ни другого. И они должны совпадать, "a' - неправильная строка.

Строка, заключенная в кавычки, - \"[^\"]*\"|'[^']*'. Строка без кавычек, предшествующая комментарию, является [^#]*.

. Таким образом, мы получаем общее регулярное выражение:

(\"[^\"]*\"|'[^']*'|[^#]*)\s*#(.*)
2 голосов
/ 20 октября 2019

Вы должны захватить начальную цитату (если есть), а затем использовать обратную ссылку позже, чтобы убедиться, что, если первое '" было найдено, '" требуется в конце матча до #:

([\"']?)(.*?)\1\s*(#.*)

https://regex101.com/r/Rpb5wL/1

(обратите внимание, что, поскольку первоначальная цитата теперь захвачена, вам придется изменить код, который использует результирующие группы, чтобы учесть это - например, # часть теперь будет в 3-й группе, а не во 2-й группе)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...