2014-06-23 4 views
3

Я хотел бы, чтобы удалить все (за исключением символов, как {}$* \w+ ""), который находится между ; и #:Удалить строку между символами

Например, я хотел бы удалить из этой строки:

Вход:

OR(AND(CA18*CB18);M10#;ABZZ/kld // remove ;M10#

Выход:

OR(AND(CA18*CB18);ABZZ/kld

Я попробовал его с этим регулярным выражением:

^[;]\w+([A-Za-z0-9])[#]

Однако, это не похоже на работу каких-либо рекомендаций?

+1

Вы можете определить «все»? включает ли это несколько ';' и/или '#' внутри удаленной строки? или любые символы, отличные от этих 2? или просто какие-либо слова? – Aprillion

+0

@deathApril Thx для вашего ответа! В основном строки будут содержать в себе такие символы: 'M $ 10, {,}, *, $' – mrquad

+1

, что ожидалось бы для вывода OR (M1; M2 #; M # 3; M4) '? – Aprillion

ответ

2

решения для обновленного вопроса будет:

// the actual regex is ;[{}$*\w"']+?#, but extra escaping is needed for Java: 
input.replaceAll(";[{}$*\\w\"']+?#", ""); 

, где вы можете обновить набор символов между [], чтобы соответствовать вашим фактическим потребностям так как вы обнаружите больше случаев краев.

Если вы решили, что вам нужно черный список символов вместо этого, вы можете использовать выражение с инвертированным набором символов (^ внутри [], не путать с^в начале регулярного выражения, которое обозначает начало строки):

;[^;#]+?# 
+0

Получил ошибку 'Invalid escape sequence (допустимые - \ b \ t \ n \ f \ r \" \ '\\) 'для вашего ответа! Обновление Pls! – mrquad

+1

@Kare right, java и regexes, обновлено. – Aprillion

+0

'' 'требуется только обратная косая черта (см. подсветку синтаксиса вашего ответа). – sp00m

2

Ваше регулярное выражение принимает только два символа символы не

;[A-z0-9]*?# 

Будет ли что-нибудь между ними захватить. Такое же регулярное выражение с + вместо * будет соответствовать экземплярам, ​​по крайней мере, на символе между символами.

+0

THx для вашего ответа! Text = text.replaceAll (" ^; [A-z0-9] *? ( – mrquad

+0

В этом случае бесполезная «*?» мощность бесполезна. – sp00m

+0

Он был обновлен без '^'. Тогда он должен работать. жадный '*' использовался для предотвращения случаев, когда имеется более одной пары символов, чтобы избежать замены всего между ними. –

4

Попробуйте это решение:

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 
+2

Обратите внимание, что это решение также удалит'; M10; M11 # '- не уверен, что это ожидалось OP. – Aprillion

+0

Да, правильно. Просто добавлено определение всего моего ответа ! Спасибо за ваш ответ! – mrquad

1

Это должно сделать работу:

String sURL = "OR(AND(CA18*CB18);M10#;ABZZ/kld"; 
System.out.println(sURL.replaceAll(";\\w+?#", "")); 
+0

Почему только '\ w'? Он просит« все ». –

+0

Thx for ваш ответ! Я попробовал это с другой комбинацией символов между символами '$, /, (, *', однако '\ w +' соответствует только буквенно-цифровым символам. Любые рекомендации для соответствия всем символам между ними? – mrquad

+0

@JamieCockburn Не определено, поэтому я догадываюсь из проверенного выражения OR, что thare может быть только символом слова – Jens

4
  • ^ среднее s «начало строки», т. е. ваша строка должна начинаться с ;, что не так (начинается с O).

  • \w+([A-Za-z0-9]) вполне излишними: \w на самом деле [A-Za-z0-9_], так что если вы действительно не нужна эта _ различия, \w+ должно быть достаточно

Так, просто попробуйте: ;\w+#


Если вам нужен любой символ между ; и # (т.е.не только [A-Za-z0-9_]): ;[^;#]+#

Regular expression visualization

Debuggex Demo

+2

+1 для объяснения значения'^'и упрощения регулярного выражения. (Вы можете добавить объяснение '' 'для полноты ты. – Cromax

+0

THX для этого отличного объяснения! Просто добавлено определение «все». Буду признателен, если вы добавите это в свой ответ! – mrquad

0

Try это регулярное выражение

[^;]*?#; 
+0

Pls объясняет, что он делает? – mrquad

+0

Он удалит любое появление символа или цифр между ними; а также #. Например: OR (AND (CA18 * CB18); M10 #; ABZZ/kld удалит: M10 # – vicky

Смежные вопросы