2017-02-04 9 views
1

Я работаю над веб-приложением, в котором пользователи могут комментировать и отвечать на комментарии, это использует систему тегов. Пользователи в настоящее время помечены их имя, которое может содержать несколько слов, поэтому я решил отметить дубли, как это:Javascript regex для тега в комментариях

& & John Doe & &

Так комментарий может выглядеть следующим образом :

& & John Doe & &, вы уверены, что & & Алиса Джонсон & & ушел?

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

До сих пор у меня есть:

^&&.+{2, 64}&&$ 

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

& & anythingbetween2and64charslong & &.

Заранее благодарен!

+0

Есть некоторые крайние случаи, которые вы хотите рассмотреть? Как '&' внутри имени или выхода из механики? В противном случае просто перейдите к '&&. {2,64}?&& ' –

+0

Нет, имена пользователей будут содержать только буквенные символы, пробелы и апострофы. –

+0

Видимо, это работает просто отлично, огромное спасибо! –

ответ

3

(.*?)&& означает "все до & &":

var before = document.getElementById("before"); 
 
var after = document.getElementById("after"); 
 
var re = /&&(.*?)&&/g, b = "<b>$1</b>"; 
 

 
after.innerHTML = before.textContent.replace(re, b);
<p id="before">&&John Doe&&, are you sure that &&Alice Johnson&& is gone?</p> 
 
<p id="after"></p>

+1

Не используйте 'innerHTML', поскольку он уничтожит события и инициирует регенерацию DOM. Вместо этого используйте что-то вроде [mark.js] (https://markjs.io/), например. 'new Mark (document.getElementById (" before ")). markRegExp (/&&(.*?) &&/g);' – dude

+0

Вы правы @dude, я использую его только для демонстрационной цели, но это может ввести в заблуждение :-) – leaf

0

попробуйте &{2}.{2,64}&{2}

, если вы хотите, чтобы матч между добавить скобки для группы матча

&{2}(.{2,64})&{2}

прямо сейчас ваш только проверка строки, где соответствует всей линии

^ символа означает начало строки $ символа означает конец строки \A означает начало всей строки \Z означает конец всей строки

0

Вот что вам нужно:

str.match(/&&.{2,64}?&&/g) 
  • Вам необходимо удалить ^ и $ с самого начала и конца, так как они соответствуют началу и концу строки.
  • добавить /g флаг в конце, так что все матчи будут сопоставляться
  • ? после {} делает матч нежадным, так что он будет соответствовать самой короткой возможной строки между «& &», а не самый длинный (будет дать YOU "& & John Doe & &" вместо "& & John Doe & &, вы уверены, что & & Элис Джонсон & &")

Читайте на алчности: Repetition with Star and Plus

-1

Это регулярное выражение будет соответствовать любой букве Unicode между & & знаками:

str.match(/\&\&[\p{L}\p{N}]+(?:\s+[\p{L}\p{N}]+)*\&\&/g); 

Здесь

\p{L} -> Любые юникода письмо, то имена могут быть любыми языками и буквами
\p{N} -> Любая цифра Unicode
[\p{L}\p{N}]+ -> А слово, построенное с Юникода букв или цифр
\s+ -> Пробелы между словами, не более 3 Длина
[\p{L}\p{N}]+(?:\s+[\p{L}\p{N}]+)* -> Все слова группы

+0

Теперь это похоже на полный подход, спасибо, сэр! –

+0

Да, вы знаете, что имена - это все языки разных языков, поэтому вам нужно использовать случай соответствия Unicode для шаблона регулярного выражения, обновить его – webmaster

+0

. Это будет работать только с [XRegExp] (http://xregexp.com/). Встроенный механизм JJ regex не поддерживает классы свойств Unicode. –

 Смежные вопросы

  • Нет связанных вопросов^_^