Удалить строку между символами

#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_] ): ;[^;#] #

Визуализация регулярных выражений

Демонстрация Debuggex

Комментарии:

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#