2015-10-23 4 views
2

рассмотрят сценарий ниже я иметь входную строкустроки заменить все регулярное выражение, чтобы не совпадает, если вложенные

"input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]" 

моя желаемые из строки после замены всего все [yes] будут заменены Yes однако, если он вложен в вторичный или н-backets такие модели должны быть проигнорированы, то предположение о том, что все открывающие скобки будут правильно закрыты, здесь есть искомая строка вывода

"input Yes Yes Yes [mk:[yes] [yes] [yes]] Yes [iif:[yes] [yes] [yes]]" 

вот мой вопрос в двух словах, можно REGEX недеформированной «вложенные» образцы? или рекурсии абсолютная необходимость в этом выполнении этого и регулярное выражение просто не хватает достаточно

если обнаружение бесконечно вложенного регулярного выражения не может быть сделано, как о вложенном второй степени только как моих примеры

+0

Это не может быть сделано с помощью регулярных выражений, вы должны написать свой собственный синтаксический анализатор. –

ответ

2

EDIT 1

Как это не может быть сделано с регулярным выражением, как указывал ВКС, я написал простую программу, которая будет делать то же самое для вас в Java:

public class Main { 

    public static String nestedReplace(String s) { 
     int nested =0,i=0; 
     StringBuilder o = new StringBuilder(); 
     while(i<s.length()) 
     { 
      if(nested==0 && s.regionMatches(i,"[yes]",0,4)) 
      { 
       o.append("Yes"); 
       i += 5; 
       continue; 
      } 
      else if(s.charAt(i) == '[') 
       nested++; 
      else if(s.charAt(i) == ']') 
       nested--; 
      o.append(s.charAt(i)); 
      i++; 
     } 
     return new String(o); 
    } 

    public static void main(String[] args) { 
     System.out.println(nestedReplace("input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]")); 
    } 
} 

выход:

input Yes Yes Yes [mk:[yes] [yes] [yes]] Yes [iif:[yes] [yes] [yes]] 
+0

Это слишком хрупкое !!!!!!! https://regex101.com/r/kO1cB4/2 ... ему нужно рекурсивное регулярное выражение, которое не поддерживается java – vks

+0

Фактически, шаблон намного сложнее, вы ответите, что не будете работать здесь [да] [нет] [да] [ mk: [yes]] [yes] [iif: [yes] [no] [yes] iifnot [возможно]], главная цель - обнаружить и заменить только те [да], которые не вложены внутри brakets – jyonkheel

+0

@jyonkheel you не могу сделать это с регулярным выражением в java ....... вам придется писать собственный парсер – vks

1

Попробуйте с:

\[[^\[\]]+\[.+?][^\[\]]*\]|\[([a-z])[^\[\]]+\] 

DEMO

При этом вы будете соответствовать целые вложенные скобки или не-гнездовой кронштейн. Затем замените содержимое только если Matcher найдет group(1) (не вложен кронштейн), как в:

public class Test { 
    public static void main(String[] args){ 
     String[] strings = {"input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]", 
       "input [yes] [yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]", 
       "input [yes] [yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]"}; 

     Pattern pattern = Pattern.compile("\\[[^\\[\\]]+\\[.+?][^\\[\\]]*\\]|\\[([a-z])[^\\[\\]]+\\]"); 

     for(String string : strings) { 
      Matcher matcher = pattern.matcher(string); 
      while (true) { 

       if (matcher.find()) { 
        if (matcher.group(1) != null) { 
         string = string.substring(0, matcher.start(1)) + string.substring(matcher.start(1), matcher.end(1)).toUpperCase() + string.substring(matcher.end(1)); 
         matcher.reset(string); 
        } 
       } else { 
        break; 
       } 
      } 
      System.out.println(string); 
     } 
    } 
} 

, который дает выход:

input [Yes] [Yes] [Yes] [mk:[yes] [yes] [yes]] [Yes] [iif:[yes] [yes] [yes]] 
input [Yes] [Yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [Yes] [mk:[yes] [yes] [yes]] [Yes] [iif:[yes] [yes] [yes]] 
input [Yes] [Yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [mk:[yes] [yes] [yes]] [Yes] [iif:[yes] [yes] [yes]] 
Смежные вопросы