который имеет преимущество для работы с другими двигателями регулярных выражений тоже.

от вопрос уже есть ответ здесь:

Как мне сопоставить любой символ в нескольких строках регулярного выражения? 21 ответ

Я люблю регулярные выражения. Тем не менее, я только сейчас столкнулся с невозможностью использоватьs флаг при запуске JavaScript RegExp в браузере. Мне интересно, почему этот флаг не включен? Это было бы действительно полезно.

Я видел, что есть внешняя библиотекаXRegExp что позволяет этоs флаг (и некоторые другие), но мне также любопытно, почему эти дополнительные (и полезные) флаги также не существуют в стандартном JavaScript. Я также не хочу включать еще одну внешнюю библиотеку ...

Вот пример, в котором я пытаюсь решить проблему с обнаружением открывающих / закрывающих тегов для коротких кодов WordPress, которые могут иметь новые строки внутри (или мне нужно вставить новые строки между ними, чтобы улучшить обнаружение).

//
// Let's take some input text, e.g. WordPress shortcodes
//
var exampleText = '[buttongroup class="vertical"][button content="Example 1" class="btn-default"][/button][button class="btn-primary"]Example 2[/button][/buttongroup]'

//
// Now let's say I want to extract the shortcodes and its attributes
// keeping in mind shortcodes can or cannot have closing tags too
//
// Shortcodes which have content between the open/closing tags can contain
// newlines. One of the issues with the flags is that I can't use `s` to make
// the dot character.
//
// When I run this on regex101.com they support the `s` flag (probably with the
// XRegExp library) and everything seems to work well. However when running this
// in the browser I get the "Uncaught SyntaxError: Invalid regular expression
// flags" error.
//
var reGetButtons = /\[button(?:\s+([^\]]+))?\](?:(.*)\[\/button\])?/gims
var reGetButtonGroups = /\[buttongroup(?:\s+([^\]]+))?\](?:(.*)\[\/buttongroup\])?/gims

//
// Some utility methods to extract attributes:
//

// Get an attribute's value
//
// @param string input
// @param string attrName
// @returns string
function getAttrValue (input, attrName) {
  var attrValue = new RegExp(attrName + '=\"([^\"]+)\"', 'g').exec(input)
  return (attrValue ?  window.decodeURIComponent(attrValue[1]) : '')
}

// Get all named shortcode attribute values as an object
//
// @param string input
// @param array shortcodeAttrs
// @returns object
function getAttrsFromString (input, shortcodeAttrs) {
  var output = {}
  for (var index = 0; index < shortcodeAttrs.length; index++) {
    output[shortcodeAttrs[index]] = getAttrValue(input, shortcodeAttrs[index])
  }
  return output
}

//
// Extract all the buttons and get all their attributes and values
//
function replaceButtonShortcodes (input) {
  return input
    //
    // Need this to avoid some tomfoolery.
    // By splitting into newlines I can better detect between open/closing tags,
    // however it goes out the window when newlines are within the
    // open/closing tags.
    //
    // It's possible my RegExps above need some adjustments, but I'm unsure how,
    // or maybe I just need to replace newlines with a special character that I
    // can then swap back with newlines...
    //
    .replace(/\]\[/g, ']\n[')
    // Find and replace the [button] shortcodes
    .replace(reGetButtons, function (all, attr, content) {
      console.log('Detected [button] shortcode!')
      console.log('-- Extracted shortcode components', { all: all, attr: attr, content: content })

      // Built the output button's HTML attributes
      var attrs = getAttrsFromString(attr, ['class','content'])
      console.log('-- Extracted attributes', { attrs: attrs })
      
      // Return the button's HTML
      return '<button class="btn ' + (typeof attrs.class !== 'undefined' ? attrs.class : '') + '">' + (content ? content : attrs.content) + '</button>'
    })
}

//
// Extract all the button groups like above
//
function replaceButtonGroupShortcodes (input) {
  return input
    // Same as above...
    .replace(/\]\[/g, ']\n[')
    // Find and replace the [buttongroup] shortcodes
    .replace(reGetButtonGroups, function (all, attr, content) {
      console.log('Detected [buttongroup] shortcode!')
      console.log('-- Extracted shortcode components', { all: all, attr: attr, content: content })
      
      // Built the output button's HTML attributes
      var attrs = getAttrsFromString(attr, ['class'])
      console.log('-- Extracted attributes', { attrs: attrs })
      
      // Return the button group's HTML
      return '<div class="btn-group ' + (typeof attrs.class !== 'undefined' ? attrs.class : '' ) + '">' + (typeof content !== 'undefined' ? content : '') + '</div>'
    })
}

//
// Do all the extraction on our example text and set within the document's HTML
//
var outputText = replaceButtonShortcodes(exampleText)
outputText = replaceButtonGroupShortcodes(outputText)
document.write(outputText)

С помощьюs Флаг позволил бы мне сделать это легко, однако, поскольку он не поддерживается, я не могу использовать преимущества флага.

 Matt Scheurich25 сент. 2017 г., 18:04
Ой, мой плохой - путаница со всем, кто летает по RegExp. Я исправил ссылку
 Amy25 сент. 2017 г., 17:42
 T.J. Crowder25 сент. 2017 г., 17:44
@ Энди: Тогда какregex101.com (без р) нет (насколько я знаю) и я и другие использовали его годами. Мэтт, это просто опечатка в вашем кодовом комментарии в вопросе?
 Andy25 сент. 2017 г., 17:41
Предупреждение всем, кому интересно посмотретьregexp101.com: не, Похоже на вредоносный сайт.
 T.J. Crowder25 сент. 2017 г., 18:13
Я обновил свой ответ, чтобы сказать это, но вы сказали,«Когда я запускаю это на regex101.com, они поддерживают флаг s ...» в вопросе. Вы только что установили неправильный «вкус» регулярного выражения.

Ответы на вопрос(1)

Решение Вопроса

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

Этов процессе добавления сейчас, В настоящее времяЭтап 3, так что, возможно, ES2018, а может и нет Этап 4 по состоянию на декабрь 2017 года, так что будет в ES2018,но шансы высоки и вы увидите, что поддержка добавляется в современные браузерыв этом году СРОЧНО.

(Смотреть за а такжесвойство unicode избегает тоже на карточках ...)

Примечание:

Когда я запускаю это на regex101.com, они поддерживаютs флаг...

Нет, если вы установили тип регулярного выражения в JavaScript через меню. Нажмите кнопку меню в левом верхнем углу:

... и измените "вкус" на JavaScript:

Вы, вероятно, оставили его по умолчанию, то есть PCRE, который действительно поддерживаетs флаг.

Они привыкли делать это более очевидным. Так как они спрятали его в меню, вы неудаленно первый человек, которого я видел, не установил это правильно ...

 Wiktor Stribiżew25 сент. 2017 г., 18:07
@Matt На самом деле[^] это не хак, это соответствует не-ничто, фактически ничто.
 Lucas Trzesniewski26 сент. 2017 г., 00:44
@MattScheurich вы также можете использовать[\s\S] который имеет преимущество для работы с другими двигателями регулярных выражений тоже.
 Matt Scheurich25 сент. 2017 г., 17:46
Спасибо за ссылку! Мне удалось также решить мою проблему, используя[^] взломать тоже.

Ваш ответ на вопрос