2017-01-08 3 views
0

Я фильтровальная некоторые сообщения в JavaScript и мне нужно выбрать последний квадрат значение кронштейна (включая квадратные скобки [ и ]) и заменить его :.Регулярного выражения: Совпадение только последние квадратные скобки

В качестве примера:
[World] [anything] [any] steamName[characterName]:message
Wanna изменение:
[World] [anything] [any] steamName: message

Это [characterName]: то, что я хочу быть reclaced на :

I» ve проверили следующие регулярные выражения:
Это не работает с пространством в середине имени.
\[(\S*?)\]: (link to regexr.com)

Это один работает только тогда, когда существует только один [squareBracket] с пробелом перед ним, как вы можете увидеть в ссылке.
\[(.*?)\]: (link to regexr.com)

мне нужно как смесь между двумя, которая работает в каждом конкретном случае.
Я хотел бы, чтобы вы предоставить мне регулярному_выражение Я ищу с ссылкой на regexr.com со следующими случаями (соответствие сильных слов), чтобы доказать, что он работает:

Hi!I'm a Player!1[Привет я! «м игрока 1]:message
[VIP] [Admin] Hi!I'm admin[Привет Я админ]:message
[VIP] Player[Player]:message
[VIP] [any] Player[(# @ # игрока 123!)]:some message
[VIP] [any] 3number2[121223]:message
[Area] [bla] [bla] anyth1ng[[[[[[((что-то #]]]:message message message

I подумайте, что важно добавить, что перед двоеточием всегда будет квадратная скобка: [this]:, вот что я хочу, чтобы она соответствовала замене.

Надеюсь, я был достаточно ясен. Не стесняйтесь задавать любые вопросы.

+0

Ваш последний случай: будет открытия/закрытия скобки всегда быть соединены друг с другом или они могут быть в высшей степени неоднозначным. Если последнее, как определить, что именно принадлежит внутри и что извне? –

+0

Является последним '[]' всегда следуют ':'? (Если да, см. Ответ @ Maslo) – BrunoLM

+0

Почему отрицательный? Наверное, я не понял в своем вопросе? Надеюсь, я должен его улучшить? –

ответ

1

var msg = `Hi!I'm a Player!1[Hi!I'm a Player!1]:message 
 
[VIP] [Admin] Hi!I'm admin[Hi!I'm admin]:message 
 
[VIP] Player[Player]:message 
 
[VIP] [any] Player[(#@#Player !123)]:some message 
 
[VIP] [any] 3number2[121223]:message 
 
[Area] [bla] [bla] anyth1ng[[[[[[((something#]]]:message message message`; 
 

 
var newMsg = msg.replace(/\[[^\]]*\]+:/g, ': '); 
 

 
console.log(newMsg);

Regex explanation from Regex101

/\[[^\]]*\]+:/g

  • \[ соответствует символу [ буквально (чувствительно к регистру)
  • матча один символ не присутствует в список ниже [^\]]*
    • * квантор - Матчи между нулем и неограниченное количество раз, как столько раз, сколько возможно, отдавая при необходимости (жадный)
    • \] соответствует символу ] буквально (чувствительно к регистру)
    • \]+ соответствует знак ] буквально (в кейсерах)
    • + Квантификатор - соответствует одному и неограниченному времени как можно дольше, возвращая при необходимости (жадный)
  • : соответствует символу : буквально (чувствительно к регистру)
  • Глобальные флаги модели
    • g Модификатор: глобальный. Все матчи (не возвращаются после первого матча)
+0

Это именно то, что я искал. @ Ответ Масло все же хорош для других языков. –

2

Попробуйте следующее:

\[[^]]*\]+: 

https://regex101.com/r/f0GHkK/1

+0

Кажется, что это не работает в JavaScript. –

+1

@JoseSerodio Попробуйте '\ [[^ \]] * \] +:', он просто забыл сбежать ']' ('\]') – BrunoLM

+0

@BrunoLM удивительный, он сделал трюк! Спасибо вам, ребята. –

1

Используйте негативный взгляд вперед еще на один квадратный Braket:

\[[^\]]*\](?!.*]) 

Весь матч ваша цель, soyiur repkamwnt строка jusr ":" (нет необходимости в группах).

+0

Почти, но это не работает для последнего случая.Кажется, что если вы поместите другой '' 'внутри скобок, не будет соответствовать:' [something]] ' –

+0

Вам нужен парсер. Regex не может обрабатывать произвольное вложение. Вы изменили вопрос. Я выхожу. – Bohemian

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