2013-08-01 2 views
0

Это регулярное выражение (дополнительное \ для каждого \, потому что это в Java кодекак сделать это регулярное выражение жадного

\\*\\{[\\w\\W]*\\}\\* 

Действительное будет

\*\{[\w\W]*\}\* 

, но это выражение не жадный на} * стороне. Я пытаюсь соответствовать все между {и} так что если у меня есть

*{ some comment }* hi there and some stuff *{ comment 2 }* and soe more stuff 

должны закончить с

hi there and some stuff and soe more stuff 

но вместо этого не достаточно жадный. Здесь есть информация о жадности, и я думал, что хочу X1, где это будет

\\*\\{[\\w\\W]*\\}1\\* or \\*\\{[\\w\\W]*\\}{1}\\* 

но это не работает. Как использовать свою вещь X {n}, чтобы вызвать жадность здесь в этом примере?

+0

Ммм, я думаю, что \ ш \ W закручивает его, так как это также будет соответствовать} *, но я действительно хочу математику * или} посередине до следующего} * ... еще не уверен, как это сделать. –

ответ

4

ReplaceAll с регулярным выражением, но добавить ? поэтому [\ ш \ W] будет не жадный, как это:

String yourString = "*{ some comment }* hi there and some stuff *{ comment 2 }* and soe more stuff"; 
yourString.replaceAll("\\*\\{[\\w\\W]*?\\}\\*",""); 

тогда вы получите, что hi there and some stuff and soe more stuff

+1

, который отлично работал !!!! ..... как получилось? после \\ w \\ W и перед}. Это оно ? действительно переключить вещь после нее на жадность? Я положил? после}, который не работал, и вы положили его раньше ... (это отлично работало, и теперь я просто пытаюсь понять, почему) –

+0

, что '?' не является жадным подходом. вместо этого '*' жадный. '*?' означает ленивый подход ноль или более случаев. – Angga

+0

О, да, я вижу X *? на http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html как «неохотный квалификатор». Это означает, что нужно как можно меньше совпадений, чтобы соответствовать следующей последовательности? Если это так, я думаю, тогда я понимаю. –

2

попробовать что-то вроде этого:

\*\{((?!\}\*).)*\}\* 

Или в Java форме:

\\*\\{((?!\\}\\*).)*\\}\\* 

Он использует negative lookahead отличить }* закрывающий тег только из }. Это часть ((?!\}\*).)*.

Редактировать: Вот (Java) версия, которая позволяет использовать символы новой строки. Вы также можете использовать Pattern.DOTALL, чтобы сделать . включенными символами новой строки, поэтому приведенные выше шаблоны будут работать.

\\*\\{((?!\\}\\*)[\\s\\S])*\\}\\* 

Обратите внимание, что это не будет рекурсивным. У вас не может быть чего-то вроде *{ foo *{ bar }* }* и все это рассматривается как комментарий. Это сделало бы эту контекстно-свободную грамматику и trying to parse CFGs is among the most famous no-nos with regex.

+1

Я полагаю, вы могли бы вытащить что-нибудь подделанное с рекурсивным регулярным выражением (при условии, что Java поддерживает его), но согласился. Это было примерно то, что я собирался предложить. – zebediah49

+0

hmmm, не работает ... У меня есть новые строки в фактическом коде .... это будет работать с новыми символами? (Моя первая версия имела эту проблему в java, поэтому у меня ее не было. * –

+0

@ zebediah49 - Yup, рекурсивное регулярное выражение, вероятно, сработает. Я не упоминал об этом, потому что я не уверен, поддерживает ли Java их, и потому что я все равно считаю, что нет-нет здесь, исходя из уровня боли и усилий. –

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