2014-09-29 8 views
1

Я использую регулярные выражения, чтобы сделать базовое преобразование кода разметки wiki в текстовый текст с возможностью копирования, и я использую javascript для выполнения работы.Javascript Regex заменяет только первое совпадение

Однако механизм регулярных выражений javascript отличается от тех, которые я использовал ранее, а также регулярного выражения в Notepad ++, которое я использую ежедневно.

Для ПРИМЕР- данной тестовой строки:

==Section Header== 
===Subsection 1=== 
# Content begins here. 
## Content continues here. 

Я хочу закончить с:

Section Header 
Subsection 1 
# Content begins here. 
## Content continues here. 

Просто удалите все равно знаки.

Я начал с установкой регулярного выражения:

var reg_titles = /(^)(=+)(.+)(=+)/ 

Это регулярного выражением для поиска строк, которые начинаются с одной или более равным с другим набором из одного или нескольких равных. Rubular показывает, что он точно соответствует моим строкам и не улавливает равные знаки в середине круга. http://www.rubular.com/r/46PrkPx8OB

Код для замены строки на основе регулярных выражений

var lines = $('.tb_in').val().split('\n'); //use jquery to grab text in a textarea, and split into an array of lines based on the \n 
for(var i = 0;i < lines.length;i++){ 
    line_temp = lines[i].replace(reg_titles, ""); 
    lines[i] = line_temp; //replace line with temp 
} 
$('.tb_out').val(lines.join("\n")); //rejoin and print result 

Мой результат, к сожалению:

Section Header== 
Subsection 1=== 
# Content begins here. 
## Content continues here. 

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

Даже когда мое регулярное выражение обновлена: вар reg_titles =/(= {2,})/

"Найдите два или более равные", выход по-прежнему идентичен. Он делает единственную замену и игнорирует все остальные совпадения.

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

Любые советы о том, как заставить мою строку заменить функцию, чтобы заменить ВСЕ экземпляры совпадающего регулярного выражения, а не только первого?

+0

вы, вероятно, не используя 'G' флаг выполнить несколько (глобальный) соответствует – vol7ron

ответ

3
^=+|=+$ 

Вы можете использовать this.Do не забудьте добавить g и m flags.Replace с помощью `` .Увидь демо.

http://regex101.com/r/nA6hN9/28

+0

Я не понимал, что должен был установить эти флаги, но он отлично работает, спасибо вам большое. Также спасибо за этот сайт, это определенно шаг выше рублевого для справки! Примите ваш ответ, когда сайт разрешит мне. –

+0

@ChrisRiley, это правда. Отличный сайт. Попробуйте, измените, узнайте :) – vks

2

Добавьте модификатор g сделать глобальный поиск:

var reg_titles = /^(=+)(.+?)(=+)/g 
+0

Почему вы захватить стартовый якорь? –

+0

@AvinashRaj В основном потому, что он был в исходном коде и не влиял.Во всяком случае, он уже отредактирован. –

1

Ваше регулярное выражение понапрасну комплекс, и все же на самом деле не сделать то, что вы намеревались сделать. :) Вы можете попробовать что-то вроде этого, вместо:

var reg_titles = /^=+(.+?)=+$/; 
lines = $('.tb_in').val().split('\n'); 
lines.forEach(function(v, i, a) { 
    a[i] = v.replace(reg_titles, '$1'); 
}) 
$('.tb_out').val(lines.join("\n")); 
Смежные вопросы