2014-02-21 63 views
0

我想解析包含由#字符引入的單行註釋的KConf文件。下面你可以找到這樣的文件的例子。如何去掉包含多個字符串和註釋符號的行的註釋

https://github.com/torvalds/linux/blob/master/arch/x86/Kconfig

我知道單行測試字符串看起來幾乎隨機儘管它應該包含在不引入一個字符串意見最如果不是嵌套的散列和字符串和報價的所有變體。

我現在使用的基於Java的Groovy中的正則表達式引擎。

測試串

Lorem "ipsum # \" dolor" sit amet, 'consectetur # \' adipiscing' elit. Maecenas 'suscipit #mollis' quam, non #bibendum 'elit # eleifend "in. Duis # convallis" luctus nunc, ac luctus lectus dapibus at.

期望結果

Lorem "ipsum # \" dolor" sit amet, 'consectetur # \' adipiscing' elit. Maecenas 'suscipit #mollis' quam, non

(前導間隔)

#bibendum 'elit # eleifend "in. Duis # convallis" luctus nunc, ac luctus lectus dapibus at.

+0

一些解釋將是很好。此外,你正在使用正則表達式的語言。哦,你的嘗試也是如此。 – Jerry

+0

'#bibendum'elit#eleifend「in。Duis#convallis」luctus nunc,ac luctus lectus dapibus at .'似乎包裹起來,那裏是否有自然的換行符? – sln

+0

此外,沒有明確的引用規則來操作。註釋在編譯時從字符串中剝離,這看起來不像源代碼字符串,它看起來是逐字的。 – sln

回答

1

首先,我逃脫你的字符串,因此它可以被存儲爲使用JavaScript變量(因爲你似乎並沒有標明語言,我假設JS):

var str = 'Lorem "ipsum # " dolor" sit amet, \'consectetur # \' adipiscing\' elit. Maecenas \'suscipit#mollis\' quam, non #bibendum \'elit # eleifend "in. Duis # convallis" luctus nunc, ac luctus lectus dapibus at.';

要刪除一切有一個「」,後跟一個「#」,這是後面有一個空格:

str.replace(/ #[^ ].*/, ''); 

最後,你的第二個理想的結果絕對沒有意義。

所有這些當然都可以通過正確的描述來獲得幫助。

+0

好吧,必須給予信譽,找到這個確切的測試案例的解決方案:D看起來我必須改善它。在'suscipit'之後加上一個空格,你的正則表達式也匹配一個字符串:S http://regex101.com/r/fF8dA1 –

+0

我假設它全部都是字符串。 – tenub

0

基於有限的信息,這個正則表達式可能工作。
雖然試圖區分嵌入式哈希,但看起來有點複雜。
沒有時間測試它,但cut'n粘貼了一些正則表達式片斷。
請注意,它應該用於多線模式。一切都是面向一個線條分析。
I.e.正則表達式中的任何內容都不會跨越行。

# (?-s)^(?:"[^"\\\n]*(?:\\.[^"\\\n]*)*"|'[^'\\\n]*(?:\\.[^'\\\n]*)*'|[^#"'\s]+|(?<=[^\s#])\#+|[^\S\n]+(?!\#))*(?:[^\S\n]+|^)(\#.*)$ 
# "(?-s)^(?:\"[^\"\\\\\\n]*(?:\\\\.[^\"\\\\\\n]*)*\"|'[^'\\\\\\n]*(?:\\\\.[^'\\\\\\n]*)*'|[^#\"'\\s]+|(?<=[^\\s#])\\#+|[^\\S\\n]+(?!\\#))*(?:[^\\S\\n]+|^)(\\#.*)$" 

(?-s)     # Modifier, No dot all 
^      # Beginning of line 
(?: 
     "      # Double quotes 
     [^"\\\n]* 
     (?: \\ . [^"\\\n]*)* 
     " 
    |      # or 
     '      # Single quotes 
     [^'\\\n]* 
     (?: \\ . [^'\\\n]*)* 
     ' 
    |      # or 
     [^#"'\s]+    # Not hash, quotes, whitespace 
    |      # or 
     (?<= [^\s#])   # Preceded by a character, but not hash or whitespace 
     \#+      # Embeded hashes 
    |      # or 
     [^\S\n]+    # Whitespaces (non-newline) 
     (?! \#)    # Not folowed by hash 
)* 
(?: [^\S\n]+ | ^)  # Whitespaces (non-newline) or BOL 
(\# .*)    # (1), hash comment 
$      # End of line 
0

原始正則表達式:

^((?:\\.|("|')(?:(?!\2|\\|[\r\n]).|\\.)*\2|[^#'"\r\n])+)#.+ 

替換$1

實施例:

String re = "^((?:\\\\.|(\"|')(?:(?!\\2|\\\\|[\\r\\n]).|\\\\.)*\\2|[^#'\"\\r\\n])+)#.+"; 
String line = "Lorem \"ipsum # \\\" dolor\" sit amet, 'consectetur # \\' adipiscing' elit. Maecenas 'suscipit #mollis' quam, non #bibendum 'elit # eleifend \"in. Duis # convallis\" luctus nunc, ac luctus lectus dapibus at."; 
String uncommented = line.replaceAll(re, "$1"); 

//=> Lorem "ipsum # \" dolor" sit amet, 'consectetur # \' adipiscing' elit. Maecenas 'suscipit #mollis' quam, non 

regex101 demo

ideone demo

擊穿:

^       # Beginning of line 
    (      # Beginning of 1st capture group 
    (?:     # Non-capture group 1 
     \\.     # Match an escaped character 
    | 
     ("|')    # Or, a quote (and capture it in 2nd capture group), 
     (?:     # Non-capture group 2 
     (?!\2|\\|[\r\n]). # Followed by any character except relevant quote, \ or newline 
     | 
     \\.    # Or an escaped character 
    )*     # Close of non-capture group 2 and repeat as many times 
     \2     # Close the quoted part 
    | 
     [^#'"\r\n]   # Any non-hash, single/double quote, newline characters 
    )+     # Close of non-capture group 1 and repeat as many times 
)      # Close capture group 1 
    #.+      # Match comments