Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Исключение символа перед строкой (регулярное выражение) (https://javascript.ru/forum/misc/20419-isklyuchenie-simvola-pered-strokojj-regulyarnoe-vyrazhenie.html)

setter 07.08.2011 17:56

Исключение символа перед строкой (регулярное выражение)
 
Здравствуйте.
Нужно все слова между круглыми скобками в тексте заменить на тоже самое, только в фигурных скобках кроме строк, где есть в начале строки символ решетки #.
<script type="text/javascript">function repl() {
var text = "Строка один (тест), ещё текст (скобки)\nНовая строка (скобка)\n#Третья строка (текст в скобках)";
text = text.replace(/\((.*?)\)/gi, '{$1}');
alert(text);
}
</script>
<button onclick="repl()">click</button>

Как это сделать, подскажите?

Sweet 07.08.2011 18:13

/\(([^#].*?)\)/g

setter 07.08.2011 18:43

Sweet,
не работает:blink:

ваый 07.08.2011 23:32

Интересная задачка. Так как реализация регулярок в javascript не поддерживает просмотры назад, то как это сделать одним выражением, затрудняюсь. Двумя можно:
text.replace(/^(.*)$/gm, function($0, $1) {
    return $0.substr(0, 1) != '#' ? $1.replace(/\((.*?)\)/g, '{$1}') : $0;
})

Sweet 08.08.2011 00:50

Цитата:

Сообщение от setter
не работает

Я не так понял, что требуется. Проще всего сделать как ваый предлагает. Только регулярка сложновата и substr - метод не уместный и, по-моему, некроссбраузерный. Я бы так написал:
text.replace(/.*/g, function(x) {
  return x.charAt(0) === '#' ? x : x.replace(/\((.*?)\)/g, '{$1}');
});

ваый 08.08.2011 01:04

Цитата:

Сообщение от Sweet
substr - метод не уместный и, по-моему, некроссбраузерный

да, вроде надежный метод (http://www.w3schools.com/jsref/jsref_substr.asp)

Aetae 08.08.2011 01:04

Можно использовать функцию, но это будет читерство.)
alert("Строка один (тест), ещё текст (скобки)\nНовая строка (скобка)\n#Третья строка (текст в скобках)".replace(/(?:^#.*$|\((.+?)\))/gim,function(a,b){return b?'{'+b+'}':a}))

ваый 08.08.2011 01:37

Прикольный способ обойти отсутствие возможности использовать негативный просмотр назад: отбратить строку и использовать негативный просмотр вперед, а потом снова обратить.
var text = "Строка один (тест), ещё текст(скобки) здесь.\nНовая строка (скобка)\n#Третья строка (текст в скобках) и (еще) текст.";

String.prototype.reverse = function () {
    return this.split('').reverse().join('');
};
alert( text.reverse().replace(/\)(.*?)\((?!.*#$)/gm, '}$1{').reverse() );

Sweet 08.08.2011 01:41

ваый, я просто помню, что про .substr что-то писали в справочнике. Если точно:
Цитата:

Этот метод описан только в ненормативной части стандарта ECMA, но реализован во всех браузерах.
Лично я пользуюсь методом .substring или .slice, если нужно искать от конца строки, например:
alert( Object.prototype.toString.call( [] ).slice( 8, -1 ) );

ваый 08.08.2011 01:48

Можно и так, через slice.
Цитата:

Сообщение от Sweet
но реализован во всех браузерах

А я всегда не стеснялся использовать substr :)


Часовой пояс GMT +3, время: 20:26.