07.08.2011, 17:56
|
Интересующийся
|
|
Регистрация: 04.05.2011
Сообщений: 19
|
|
Исключение символа перед строкой (регулярное выражение)
Здравствуйте.
Нужно все слова между круглыми скобками в тексте заменить на тоже самое, только в фигурных скобках кроме строк, где есть в начале строки символ решетки #.
<script type="text/javascript">function repl() {
var text = "Строка один (тест), ещё текст (скобки)\nНовая строка (скобка)\n#Третья строка (текст в скобках)";
text = text.replace(/\((.*?)\)/gi, '{$1}');
alert(text);
}
</script>
<button onclick="repl()">click</button>
Как это сделать, подскажите?
|
|
07.08.2011, 18:13
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
|
|
07.08.2011, 18:43
|
Интересующийся
|
|
Регистрация: 04.05.2011
Сообщений: 19
|
|
Sweet,
не работает
|
|
07.08.2011, 23:32
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Интересная задачка. Так как реализация регулярок в javascript не поддерживает просмотры назад, то как это сделать одним выражением, затрудняюсь. Двумя можно:
text.replace(/^(.*)$/gm, function($0, $1) {
return $0.substr(0, 1) != '#' ? $1.replace(/\((.*?)\)/g, '{$1}') : $0;
})
|
|
08.08.2011, 00:50
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от setter
|
не работает
|
Я не так понял, что требуется. Проще всего сделать как ваый предлагает. Только регулярка сложновата и substr - метод не уместный и, по-моему, некроссбраузерный. Я бы так написал:
text.replace(/.*/g, function(x) {
return x.charAt(0) === '#' ? x : x.replace(/\((.*?)\)/g, '{$1}');
});
|
|
08.08.2011, 01:04
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,565
|
|
Можно использовать функцию, но это будет читерство.)
alert("Строка один (тест), ещё текст (скобки)\nНовая строка (скобка)\n#Третья строка (текст в скобках)".replace(/(?:^#.*$|\((.+?)\))/gim,function(a,b){return b?'{'+b+'}':a}))
__________________
29375, 35
|
|
08.08.2011, 01:37
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Прикольный способ обойти отсутствие возможности использовать негативный просмотр назад: отбратить строку и использовать негативный просмотр вперед, а потом снова обратить.
var text = "Строка один (тест), ещё текст(скобки) здесь.\nНовая строка (скобка)\n#Третья строка (текст в скобках) и (еще) текст.";
String.prototype.reverse = function () {
return this.split('').reverse().join('');
};
alert( text.reverse().replace(/\)(.*?)\((?!.*#$)/gm, '}$1{').reverse() );
|
|
08.08.2011, 01:41
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
ваый, я просто помню, что про .substr что-то писали в справочнике. Если точно:
Цитата:
|
Этот метод описан только в ненормативной части стандарта ECMA, но реализован во всех браузерах.
|
Лично я пользуюсь методом .substring или .slice, если нужно искать от конца строки, например:
alert( Object.prototype.toString.call( [] ).slice( 8, -1 ) );
|
|
08.08.2011, 01:48
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Можно и так, через slice.
Сообщение от Sweet
|
но реализован во всех браузерах
|
А я всегда не стеснялся использовать substr
|
|
|
|