Вот так: Я хочу использовать java, чтобы удалить все, что соответствует "//[^\n]*"
, за исключением всего, что соответствует "\"[^\n]*//[^\n\"]\""
. В значительной степени мне нужно удалить все комментарии в стиле комментариев, за исключением случаев, когда он содержится внутри строки. Я попробовал regex "(//[^\n]*)-(\"[^\n]*//[^\n]*\")"
, но это ничего не заменит.Java регулярное выражение найти все A за исключением B
ответ
Это много лет назад из группы Perl, я немного изменил ее, чтобы сохранить форматирование.
Существует более простая версия, которая не сохраняет форматирование.
Этот режим использует многострочный режим из-за сохранения.
Кроме того, если у вас нет одиночных кавычек, выньте эту часть.
В основном это соответствует комментариям или комментариям.
Для запуска;
- Установить режим Multi-Line
- ли глобальное заменить
$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
Собственно, он заменяет комментарии, но только если вся строка является комментарием. В противном случае, если строка первая - комментарий, а строка 2 - нет, все будет сохранено. – HyperNeutrino
@JamesSmith: вам нужно выполнить итерацию строки в строке по исходному коду. Можете ли вы привести пример строки, которая не работает. Jdoodle явно удаляет комментарий только. –
- 1. Perl регулярное выражение, за исключением
- 2. регулярное выражение a или b
- 3. Регулярное выражение за исключением слова
- 4. Регулярное выражение, которое позволяет все символы, за исключением «<> _; {} []»
- 5. Многолинейное регулярное выражение: Найти A, где B отсутствует
- 6. javascript: Регулярное выражение для a: b
- 7. лет регулярное выражение или сопрягает все, за исключением лет
- 8. Js тест регулярное выражение, за исключением строки
- 9. Регулярное выражение, за исключением особых слов
- 10. Регулярное выражение, чтобы найти все строки a и b, содержащие четное число a и четное число b?
- 11. C# Регулярное выражение исключением полукокса
- 12. Регулярное выражение A (B + C *) == AB + A (C *)
- 13. Регулярное выражение: диапазон поиска, за исключением одной буквы или диапазона
- 14. Javascript регулярное выражение: Найти все адреса за пределами <a> тегов - Вложенные теги
- 15. Регулярное выражение: Заменить, за исключением особых символов и пробелов
- 16. Regex a: b c d a: b
- 17. Список кортежей от (a, все b) до (b, все a)
- 18. регулярное выражение \ b в java и javascript
- 19. Регулярное выражение для любого числа, за исключением конкретных чисел
- 20. Регулярное выражение соответствует a-alphanumeric & b-digits & c-digit
- 21. за исключением символов в \ S регулярное выражение матч
- 22. регулярное выражение матч группы за исключением одного члена группы
- 23. Удалите все теги HTML за исключением ссылок
- 24. Регулярное выражение, чтобы найти все строковые литералы
- 25. Match одно или более цифр, за исключением B или S
- 26. Регулярное выражение для a-b, a-c, но не a-a?
- 27. Что такое регулярное выражение, не сгенерированное над {a, b}?
- 28. Как разбить строку запятыми, за исключением скобок, используя регулярное выражение?
- 29. Как эффективно реализовать регулярное выражение типа. * A. * B. *?
- 30. PCRE регулярное выражение для сопоставления текста, за исключением группы слов
Что вам нужно, это парсер, а не регулярное выражение. – Pshemo
Я пытаюсь найти более простой способ удалить комментарии. Но я думаю, ты прав. +1 – HyperNeutrino
@JamesSmith: так что вы только хотите удалить все комментарии? –