Вопрос объяснение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:]#/].*)(-).*"
если кто-нибудь знает, как сделать его лучше, пожалуйста, сообщите мне.
Умм, «не abc, но должно быть 123», то же самое, что «должно быть 123», или '[123]' как регулярное выражение ... Или я неправильно понимаю эту часть вашего вопроса? – hyde
Это то, что вы хотите ['^ [^ \/# -] * (?: \/[^ \ /] [^ -] *)? -. *'] (Https://regex101.com/r/ yW9xZ9/1)? – revo
Что делать, если вы меняете группу захвата '(?: ...)' в группу захвата '(...)'? – revo