Регулярное выражение в Actionscript 3 - PullRequest
1 голос
/ 24 июня 2011

Мне нужно регулярное выражение AS3, которое позволяет мне находить / заменять строки, подобные этим:

var str1:String = "<value1 att="1"> some text</value1>";
var str2:String = "<value1 att="1" var="a">  some text and more</value1>";
var str3:String = "<value1 att="ok" var="b" def="12">     some text</value1>";

к этому:

str1 = "<value1 att="1">*some text</value1>";
str2 = "<value1 att="1" var="a">**some text and more</value1>";
str3 = "<value1 att="ok" var="b" def="12">*****some text</value1>";

Я хочу иметь возможность заменить пробелы в начале (внутри> <) на другой символ. Это не должно влиять на количество символов справа от пробелов или атрибутов в определении value1. </p>

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

Я думаю, что самый простой способ выполнить то, что вам нужно, это использовать функцию в выражении replace ().

var replaceMethod:Function = function (match:String, tagName:String, tagContent:String, spaces:String, targetText:String, index:int, whole:String) : String
{
    trace("\t", "found", spaces.length,"spaces in tag '"+tagName+"'");
    trace("\t", "matched string:", match);
    // check tag name or whatever you may want
    // do something with found spaces
    var replacement:String = spaces.replace(" ", "*");    
    return "<"+tagName+" "+tagContent+">"+replacement+targetText;
}

var str1:String = '<value1 att="1">    some text</value1>';
var exp:RegExp = /<(\w+)([ >].*?)>(\s+)(some text)/gm;

trace("before:", str1);
str1 = str1.replace(exp, replaceMethod);
trace("after:", str1);

Хотя это не безопасно для производительности;Если вы используете огромные блоки текста и / или запускаете эту процедуру очень часто, вы можете захотеть сделать что-то более сложное, но оптимизированное.Одним из методов оптимизации является уменьшение количества аргументов replaceMathod ().

ps. Я думаю, что это можно сделать с помощью одного выражения replace () и без использования replaceMethod ().Посмотрите на позитивные взгляды и группы, не занимающиеся захватом, может быть, вы можете понять это.http://livedocs.adobe.com/flex/3/html/help.html?content=12_Using_Regular_Expressions_09.html

0 голосов
/ 24 июня 2011

Предполагая, что в текстовых блоках нет последовательностей "*", это должно сработать:

var s:String = "<value1 att='ok' var='b' def='12'>     some text</value1>";

//find all spaces after a tag closing bracket and replace with a *
s = s.replace(/>\s/g, ">*");

//find all spaces after a * and replace it with a *
//keep doing this until no more can be found
while (s.match(/>\*+\s/g).length) {
    s = s.replace(/\*\s/g, "**");
}

Хотя я не могу придумать, как это сделать за один replace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...