以下是案例: 我想使用java刪除與"//[^\n]*"
匹配的所有內容,但任何內容都與"\"[^\n]*//[^\n\"]\""
匹配。非常多,我需要刪除所有評論樣式輸入,除非它包含在一個字符串中。我嘗試了正則表達式"(//[^\n]*)-(\"[^\n]*//[^\n]*\")"
,但這並不能代替任何東西。Java正則表達式查找除B以外的所有A
回答
這是來自多年前的一個Perl小組,我修改了一下以保留格式。
有一個更簡單的版本,不保留格式。
這個使用多行模式,因爲保存。
另外,如果您沒有單引號字符串,請取出該部分。
它基本上匹配評論或非評論。
運行它;
- 設置多行模式
- 進行全局與
$2
替換就是這樣。
# raw: ((?:(?:^[ \t]*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|/\*|//)))?|//(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|/\*|//))|(?=\r?\n))))+)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|(?:\r?\n|[\S\s])[^/"'\\\s]*)
# quoted: "((?:(?:^[ \\t]*)?(?:/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/(?:[ \\t]*\\r?\\n(?=[ \\t]*(?:\\r?\\n|/\\*|//)))?|//(?:[^\\\\]|\\\\(?:\\r?\\n)?)*?(?:\\r?\\n(?=[ \\t]*(?:\\r?\\n|/\\*|//))|(?=\\r?\\n))))+)|(\"(?:\\\\[\\S\\s]|[^\"\\\\])*\"|'(?:\\\\[\\S\\s]|[^'\\\\])*'|(?:\\r?\\n|[\\S\\s])[^/\"'\\\\\\s]*)"
( # (1 start), Comments
(?:
(?:^[ \t]*)? # <- To preserve formatting
(?:
/\* # Start /* .. */ comment
[^*]* \*+
(?: [^/*] [^*]* \*+)*
/ # End /* .. */ comment
(?: # <- To preserve formatting
[ \t]* \r? \n
(?=
[ \t]*
(?: \r? \n | /\* | //)
)
)?
|
// # Start // comment
(?: # Possible line-continuation
[^\\]
| \\
(?: \r? \n)?
)*?
(?: # End // comment
\r? \n
(?= # <- To preserve formatting
[ \t]*
(?: \r? \n | /\* | //)
)
| (?= \r? \n)
)
)
)+ # Grab multiple comment blocks if need be
) # (1 end)
| ## OR
( # (2 start), Non - comments
"
(?: \\ [\S\s] | [^"\\])* # Double quoted text
"
| '
(?: \\ [\S\s] | [^'\\])* # Single quoted text
'
| (?: \r? \n | [\S\s]) # Linebreak or Any other char
[^/"'\\\s]* # Chars which doesn't start a comment, string, escape,
# or line continuation (escape + newline)
) # (2 end)
工程就像一個魅力!正是我需要它! – HyperNeutrino
很高興聽到! – sln
您可以用下面的正則表達式一行刪除註釋:
^(([^\"]*|\"([^\"\\\\]|[\\\\].)*\")*)//.*$
並與第一匹配組替換它。這個正則表達式也考慮到了轉義報價。
在Java中,這從而倒像是:
Pattern regex = Pattern.compile("^(([^\"]*|\"([^\"\\\\]|[\\\\].)*\")*)//.*$");
String code = ...;
String result = regex.matcher(code).replaceAll("$1");
正則表達式強制執行,一旦你打開一個字符串,你需要關閉它,以及:
start string stop string
| |
v v
(([^\"]*|\"([^\"\\\\]|[\\\\].)*\")*)
^ ^ ^
| | \escapes require at least one extra token
any non-string non-escape in string
然後,您可以通過簡單地分裂String
成單線條和環比線去除所有這些評論和用上面討論的方法替換這些行。
但如果你做編程語言處理,不如採取優勢在於編程語言,或用來做這樣的語言處理框架的解析器。
這是行不通的;它不會取代評論。 – HyperNeutrino
實際上,它取代了評論,但僅限於整條評論。否則,如果第一行是註釋,而第二行不是,則所有內容都將保留。 – HyperNeutrino
@JamesSmith:你需要在源代碼上迭代每行的行數。你能舉出一個行不通的例子嗎? jdoodle顯然只會刪除評論。 –
- 1. 使用正則表達式查找除此模式以外的所有內容
- 2. 正則表達式刪除除a-zA-Z0-9以外的所有字符?
- 3. Java正則表達式來查找除''之外的所有內容。
- 4. 正則表達式查找所有字符x,a,n, -
- 5. 正則表達式a或b
- 6. 簡化正則表達式 「AB | A | B」
- 7. 正則表達式使用(a | b)
- 8. 正則表達式A「或」 B
- 9. 正則表達式!(A | B)例如不是(a或b)
- 10. 正則表達式來解析[A] [B]到A和B
- 11. 正則表達式匹配除「/」以外的所有內容
- 12. 正則表達式替換除#以外的所有符號和@
- 13. 正則表達式選擇除A以外的HTML標記
- 14. php正則表達式的子字符串以A開頭,以B結尾以便刪除A和B
- 15. 用於查找項目中所有正則表達式的正則表達式
- 16. 正則表達式:爲r創建一個例外:a。?b。?c
- 17. 查找以\結尾的所有行\使用正則表達式
- 18. Python - 正則表達式 - 查找除標籤外的所有單詞
- 19. 正則表達式(A或A或A和B),(A但不是B)
- 20. java正則表達式查找所有.txt
- 21. BeautifulSoup findall使用正則表達式找到類A或類B
- 22. 正則表達式找到A而不是B行
- 23. 正則表達式匹配模式A和沒有圖案B
- 24. Java分割「a」。「b」。「c」使用正則表達式
- 25. 正則表達式沒有2個連續的a和b的
- 26. 正則表達式來檢查除字符串以外的所有東西
- 27. 在查詢中查找所有表名的正則表達式
- 28. 在java中查找正則表達式
- 29. Java正則表達式查找文本
- 30. 問題與Java正則表達式\ b
你需要的是解析器,而不是正則表達式。 – Pshemo
我正試圖找到一種更簡單的方法來刪除評論。但我想你是對的。 +1 – HyperNeutrino
@JamesSmith:所以你只想刪除所有評論? –