Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2011, 16:56
Интересующийся
Отправить личное сообщение для setter Посмотреть профиль Найти все сообщения от setter
 
Регистрация: 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>

Как это сделать, подскажите?
Ответить с цитированием
  #2 (permalink)  
Старый 07.08.2011, 17:13
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

/\(([^#].*?)\)/g
Ответить с цитированием
  #3 (permalink)  
Старый 07.08.2011, 17:43
Интересующийся
Отправить личное сообщение для setter Посмотреть профиль Найти все сообщения от setter
 
Регистрация: 04.05.2011
Сообщений: 19

Sweet,
не работает
Ответить с цитированием
  #4 (permalink)  
Старый 07.08.2011, 22:32
Профессор
Отправить личное сообщение для ваый Посмотреть профиль Найти все сообщения от ваый
 
Регистрация: 29.06.2011
Сообщений: 445

Интересная задачка. Так как реализация регулярок в javascript не поддерживает просмотры назад, то как это сделать одним выражением, затрудняюсь. Двумя можно:
text.replace(/^(.*)$/gm, function($0, $1) {
    return $0.substr(0, 1) != '#' ? $1.replace(/\((.*?)\)/g, '{$1}') : $0;
})
Ответить с цитированием
  #5 (permalink)  
Старый 07.08.2011, 23:50
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от setter
не работает
Я не так понял, что требуется. Проще всего сделать как ваый предлагает. Только регулярка сложновата и substr - метод не уместный и, по-моему, некроссбраузерный. Я бы так написал:
text.replace(/.*/g, function(x) {
  return x.charAt(0) === '#' ? x : x.replace(/\((.*?)\)/g, '{$1}');
});
Ответить с цитированием
  #6 (permalink)  
Старый 08.08.2011, 00:04
Профессор
Отправить личное сообщение для ваый Посмотреть профиль Найти все сообщения от ваый
 
Регистрация: 29.06.2011
Сообщений: 445

Сообщение от Sweet
substr - метод не уместный и, по-моему, некроссбраузерный
да, вроде надежный метод (http://www.w3schools.com/jsref/jsref_substr.asp)
Ответить с цитированием
  #7 (permalink)  
Старый 08.08.2011, 00:04
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,750

Можно использовать функцию, но это будет читерство.)
alert("Строка один (тест), ещё текст (скобки)\nНовая строка (скобка)\n#Третья строка (текст в скобках)".replace(/(?:^#.*$|\((.+?)\))/gim,function(a,b){return b?'{'+b+'}':a}))
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 08.08.2011, 00: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() );
Ответить с цитированием
  #9 (permalink)  
Старый 08.08.2011, 00:41
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

ваый, я просто помню, что про .substr что-то писали в справочнике. Если точно:
Цитата:
Этот метод описан только в ненормативной части стандарта ECMA, но реализован во всех браузерах.
Лично я пользуюсь методом .substring или .slice, если нужно искать от конца строки, например:
alert( Object.prototype.toString.call( [] ).slice( 8, -1 ) );
Ответить с цитированием
  #10 (permalink)  
Старый 08.08.2011, 00:48
Профессор
Отправить личное сообщение для ваый Посмотреть профиль Найти все сообщения от ваый
 
Регистрация: 29.06.2011
Сообщений: 445

Можно и так, через slice.
Сообщение от Sweet
но реализован во всех браузерах
А я всегда не стеснялся использовать substr
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка e-mail регулярное выражение mycoding Общие вопросы Javascript 4 09.02.2017 09:12
регулярное выражение martinss jQuery 5 29.07.2011 11:46
Регулярное выражение: любой символ, включая перевод строки Gleb Общие вопросы Javascript 3 28.07.2011 11:15
регулярное выражение theo_ Общие вопросы Javascript 15 21.06.2010 09:29
Регулярное выражение для поиска смайлов. NightmareZ Общие вопросы Javascript 13 23.06.2009 12:12