#java #regex
#java #регулярное выражение
Вопрос:
Я хотел бы удалить все (для подобных символов {}$* w ""
), что находится между ;
и #
:
Например, я хотел бы удалить из этой строки:
Ввод:
OR(AND(CA18*CB18);M10#;ABZZ/kld // remove ;M10#
Вывод:
OR(AND(CA18*CB18);ABZZ/kld
Я попробовал это с помощью этого регулярного выражения:
^[;]w ([A-Za-z0-9])[#]
Однако, похоже, это не работает с какими-либо рекомендациями?
Комментарии:
1. можете ли вы определить «все»? включает ли она несколько
;
и / или#
внутри удаленной строки? или любые символы, отличные от этих 2? или просто любые символы word?2. @deathApril Спасибо за ваш ответ! В основном строки будут содержать эти символы:
M$10, {, }, *, $
3. для чего будет ожидаться вывод
OR(M1;M2#;M#3;M4)
?4.
OR(M1;M2#;M#3;M4)
было быOR(M13;M4
Ответ №1:
Попробуйте это решение:
String input = "OR(AND(CA18*CB18);M10#;ABZZ/kld"; // remove ;M10#
// using String.replaceAll here instead of Pattern/Matcher
//
// | starts with ; included
// || any character, reluctantly quantified
// || | ends with # included
// || | | replace all instances with empty
// || | | string
System.out.println(input.replaceAll(";. ?#", ""));
Вывод
OR(AND(CA18*CB18);ABZZ/kld
Комментарии:
1. обратите внимание, что это решение также удалит
;M10;M11#
— не уверен, ожидается ли это от OP.2. Да, верно. Просто добавил определение всего к моему ответу! Был бы признателен за ваш ответ!
Ответ №2:
^
означает «начало строки», т. Е. Ваша строка должна начинаться с;
, что не так (она начинается сO
).w ([A-Za-z0-9])
довольно избыточно:w
на самом деле[A-Za-z0-9_]
, так что, если вам действительно не нужно это_
различие,w
должно быть достаточно
Итак, просто попробуйте с: ;w #
Если вам нужен какой-либо символ между ;
и #
(т.Е. Не только [A-Za-z0-9_]
): ;[^;#] #
Комментарии:
1. 1 за объяснение значения
^
и упрощение регулярного выражения. (Вы могли бы добавить объяснение$
для полноты ты).2. Спасибо за это отличное объяснение! Просто добавлено определение «все». Был бы признателен, если бы вы добавили это в свой ответ!
Ответ №3:
решение для вашего обновленного вопроса будет:
// the actual regex is ;[{}$*w"'] ?#, but extra escaping is needed for Java:
input.replaceAll(";[{}$*\w"'] ?#", "");
где вы можете обновить набор символов между [] в соответствии с вашими фактическими требованиями по мере обнаружения дополнительных крайних случаев..
если вы решили, что вместо этого вам нужен черный список символов, вы можете использовать выражение с отрицаемым набором символов ( ^
внутри [], не путайте с ^ в начале регулярного выражения, которое обозначает начало строки):
;[^;#] ?#
Комментарии:
1. Получил ошибку
Invalid escape sequence (valid ones are b t n f r " ' \ )
для вашего ответа! Пожалуйста, обновите его!2.
"
однако требуется одна обратная косая черта (см. Подсветку синтаксиса вашего ответа).3. @sp00m ах, я никогда не пойму, как люди могут работать с регулярными выражениями в Java. подсветка синтаксиса в SO выглядела нормально, я думаю, у Java было бы другое мнение по этому поводу, обновленное снова.
Ответ №4:
Ваше регулярное выражение принимает только два символа, не являющиеся символами
;[A-z0-9]*?#
Захватит все, что находится между ними. Одно и то же регулярное выражение с a
вместо the *
будет соответствовать только экземплярам, по крайней мере, с символом между символами.
Комментарии:
1. Спасибо за ваш ответ!
text = text.replaceAll("^;[A-z0-9]*?#", "");
похоже, не выполняет эту работу; (2. Не жадная
*?
мощность в этом случае бесполезна.3. Он был обновлен без
^
. Тогда должно сработать. Также не жадный*
был использован для предотвращения случаев, когда существует более одной пары символов, чтобы избежать замены всего между ними.4. @AdamYost Да, но поскольку разрешены только символы
[A-z0-9]
, не будет никакого другого внутреннего совпадающего символа.
Ответ №5:
Это должно выполнить работу:
String sURL = "OR(AND(CA18*CB18);M10#;ABZZ/kld";
System.out.println(sURL.replaceAll(";\w ?#", ""));
Комментарии:
1. Почему только
w
? Он запрашивает «все».2. Спасибо за ваш ответ! Я попробовал использовать другую комбинацию символов между ними, например
$, /, (, *
, однакоw
она соответствует только буквенно-цифровым символам. Любые рекомендации по сопоставлению всех символов между ними?3. @JamieCockburn Не определено, что все означает. итак, я предполагаю, что из опробованного выражения OR это может быть только символ слова
4. @Kare sURL.replaceAll(«;. ?#», «») мог бы это сделать. Но я этого не пробовал
5. @Kare Я попробовал это самостоятельно и получил :
;CA18*CB18/$M$10;I
Ответ №6:
Попробуйте это регулярное выражение
[^;]*?#;
Комментарии:
1. Пожалуйста, объясните, что это делает?
2. Это удалит любое совпадение символов или цифр между; и #. Например: ИЛИ(И(CA18 * CB18);M10 #;ABZZ / kld удалит;M10#