2016-09-17 113 views
2

問題的解釋POSIX擴展正則表達式 - 包含不X,但Y(STD ::正則表達式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 

,因爲這將意味着它有一些字符不是一個,B,C後,有123這是總共4個字符,而不是我們想要的1個字符。我不知道這是否可能。所以在某種意義上這裏有兩個quatsions。

我最好的選擇,到目前爲止是:

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

這使得匹配正確的格式,但不佔的意見。

編輯

我已經找到了有效的解決方案。它的作品,但它是醜陋的地獄:

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

如果有人知道如何使它更好,請告訴我。

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

匹配:

+0

嗯,「不是abc但是必須是123」與「必須是123」或者是「[123]」一樣正則表達式......或者我誤解了你的部分問題? – hyde

+0

這是你想要的['^ [^ \ /# - ] *(?:\/[^ \ /] [^ - ] *)? - 。*'](https://regex101.com/r/ yW9xZ9/1)? – revo

+0

如果將非捕獲組「(?:...)」更改爲捕獲組「(...)」,會怎麼樣? – revo

回答

0

瞭解有關意見中要求更多的事情後,我用這個表達式來

enter image description here

順便說一句,我不知道爲什麼真的鮑勃喜歡p **

+0

如果鮑勃喜歡它,那麼他去。更新了正則表達式。 – revo

+0

如果您在'grep'中沒有使用字符串錨點'^'的開始,那麼匹配可能發生在字符串的中間,這是不希望的。我不確定'''如果它被用作輸入包裝器,那麼在我建議的RegEx中,我排除它,而是使用'^'。我承認我沒有注意到你的工作解決方案。不同於一開始,毫不猶豫地打出更多,你自己的解決方案更簡潔,更短,如果我見過你,我永遠不會和我一起去。 – revo