AS3 RegExp вопрос

Я только что написал приложение Flex, которое обрабатывает текстовое содержимое Википедии в виде строк. Я пытаюсь использовать RegExp, чтобы очистить всю разметку Википедии. Вот пример:

Я хотел бы это:

var pageText:String = new String("was an [[People of the United States|American]] [[film director]], writer, [[Film producer|producer]], and [[photographer]] who lived in England during most of the last four decades of his career. Kubrick was noted for the scrupulous care with which he chose his subjects, his slow method of working, the variety of genres he worked in, his technical perfectionism, and his reclusiveness about his films and personal life. He maintained almost complete artistic control, making movies according to his own whims and time constraints, but with the rare advantage of big-[[Movie studio|studio]] [[financial support]] for all his endeavors.");

выглядеть так:

var pageText:String = new String("was an American film director, writer, producer, and photographer who lived in England during most of the last four decades of his career. Kubrick was noted for the scrupulous care with which he chose his subjects, his slow method of working, the variety of genres he worked in, his technical perfectionism, and his reclusiveness about his films and personal life. He maintained almost complete artistic control, making movies according to his own whims and time constraints, but with the rare advantage of big-studio financial support for all his endeavors.");

Поэтому мне нужно написать RegExp, который [[Удалить эту часть | но оставь это].

Я проверил эти среди других:

           var pattern:RegExp = new RegExp(/\[\[(.+)\|/);
           var pattern2:RegExp = new regExp(/^\[\[\|/);
           var pattern3:RegExp = new RegExp(/^\[\[[A-Z].*\|$/);

           var pageTextCleaned:String = pageText.replace(pattern, " ");

Тогда было бы легко просто удалить оставшиеся [[и]]

Я совсем не привык к этому материалу RegExp, поэтому любая помощь будет отличной!

Спасибо!

3 ответа

Решение

Вы используете конструктор RegExp, который принимает строку в качестве аргумента, но передает ей RegExp. Я не думаю, что это работает, как вы хотите.
Посмотрите, работает ли он с лексическим RegExp:

var pageTextCleaned:String = pageText.replace(/\[\[([^\]]*\|)?([^\]]+)]]/g, "$2");

Это не надежно, если у вас есть сингл ]с или несколько |с внутри [[...]]с, но это начало.

Поскольку я не уверен, что максимальное количество записей>2, вот решение, которое проходит через цикл, заменяя каждую запись, которая заканчивается на "|" с "[[" до тех пор, пока ничего не останется, затем удаляет "[[" и "]]". Если всегда есть только два, вы можете немного упростить это:

 var entryPattern:RegExp = new RegExp(/\[\[\w+\|/);
 var bracketPattern:RegExp = new regExp(/[\[\[|\]\]]/);

 var pageText:String = "your text";
 var replacedText:String = "";

 while( pageText != replacedText ) {
    if( replacedText != "" ){  pageText = replacedText; }
    replacedText = pageText.replace(entryPattern, "[[");
 }

 replacedText = "";
 while( pageText != replacedText ) {
    if( replacedText != "" ){  pageText = replacedText; }
    replacedText = pageText.replace(bracketPattern, "");
 }

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

Я не знаю об AS3, но вот код JavaScript для достижения этого, который должен быть похожим:

s = s.replace(/\[\[(?:([^\]|]*)|[^\]|]*\|([^\]]*))\]\]/g, '$1$2');

Регулярное выражение довольно запутанно. Вот разбивка его частей:

  • \[\[ - две открывающиеся квадратные скобки.
  • (?: | ) - группа без захвата с двумя вариантами:

    • ([^\]|]*) - контент с не содержит символ канала, захватывает весь контент в первую группу, $1,
    • ИЛИ ЖЕ
    • [^\]|]*\|([^\]]*) - ссылка с символом трубы:
      • [^\]|]* - некоторые символы, которые не являются ] или же |,
      • \| - буквальный знак трубы.
      • ([^\]]*) - еще немного ] персонажи, попавшие во вторую группу, $2,
  • \[\[ - две закрывающие квадратные скобки.

Затем мы заменяем каждый захват $1$2 - один из них всегда пуст, а другой - строка, которую мы хотим сохранить.

Рабочий пример: http://jsbin.com/adedu4

Другие вопросы по тегам