2016-09-17 9 views
2

Вопрос объяснениеPOSIX расширенный Regex - содержат не X, а Y (станд :: регулярное выражение C++ 11)

Я пытаюсь написать регулярное выражение, чтобы пройти именно по этому формату:

"bob likes poo - whatever(&T(R)*HP#" 
" \t \t bob likes poo - *^RFVOG(IBHUO)B" 

но не на:

"//bob likes poo - GV*(GF*(" 
"# \t bob likes poo - OHG(G(*" 
"bob does not like poo G&((HOUIHBO:" 

Они бит ключа быть.

линия не начинается с символов комментария (# или //), может иметь пробелы (пробел или табуляция), должно быть что-то следует разделители («-»), после чего бы то ни было.

Случаи угла являются:

1) " \t //this is still a comment - YGV^FV*" 

все еще должен потерпеть неудачу.

2) " /i_am//_no_/comment - FG&*G*&G" 

должно пройти.

Случайные рассуждения

хорошо, мне не удалось. что заставило меня спросить, можем ли мы каким-то образом указать какой-то характер, но не другие. например

[^abc] 

просто означает любой символ, который не является a, b или c. но как бы мы сказали не abc, а 123? мы не можем просто поставить

[^abc123] 

потому, что исключит их и не может сделать

[^abc]123 

, потому что это будет означать, он должен иметь 123 после того, как какой-то символ, который не является, б, который составляет всего 4 символа вместо 1, мы хотим. Я даже не знаю, возможно ли это. Таким образом, в некотором смысле здесь есть 2 quetsions.

моя лучшая ставка до сих пор:

"[[:blank:]]*[^[:blank:]]+(-).*" 

это делает формат, соответствующий правильный, но не учитывает замечания.

EDIT

Я нашел рабочее решение. Это работает, но это некрасиво, как ад:

"[[:blank:]]*([^[:blank:]#]([^/].*)?|[^[:blank:]#/].*)(-).*" 

если кто-нибудь знает, как сделать его лучше, пожалуйста, сообщите мне.

+0

Умм, «не abc, но должно быть 123», то же самое, что «должно быть 123», или '[123]' как регулярное выражение ... Или я неправильно понимаю эту часть вашего вопроса? – hyde

+0

Это то, что вы хотите ['^ [^ \/# -] * (?: \/[^ \ /] [^ -] *)? -. *'] (Https://regex101.com/r/ yW9xZ9/1)? – revo

+0

Что делать, если вы меняете группу захвата '(?: ...)' в группу захвата '(...)'? – revo

ответ

0

После понимания больше вещей, о требованиях, предъявляемых в комментариях, я пришел с этим RegEx:

^[[:blank:]]*(\/([^\/][^-]*|)|([[:blank:]]|^)[^[:blank:]\/#][^-]*) - .* 

Матчей:

enter image description here

Кстати, я не знаю, почему на самом деле боб любит р **!

+0

Если бобу нравится это, то он идет. Обновлено регулярное выражение. – revo

+0

Если вы не используете начало строкового якоря '^' в 'grep', тогда совпадение может происходить в середине строки, что нежелательно. Я не был уверен в '' ', если он используется в качестве оболочки ввода или нет, поэтому в моем предлагаемом RegEx я исключил его и вместо этого использовал'^'. Я признаю, что я не обращал внимания на ваше рабочее решение. по-разному от начала и не стесняйтесь набирать больше. Ваше собственное решение намного чище и короче. Я никогда не пойду с моим, если увижу твое. Не стесняйтесь не принимать этот ответ. – revo