Регулярное выражение Javascript, расщепляющееся на новой строке и двоеточии [duplicate]

Js - однопоточная.

blockquote>

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

365
задан mikemaccana 8 April 2015 в 13:50
поделиться

15 ответов

Передать в regexp как параметр:

js> "Hello awesome, world!".split(/[\s,]+/)
Hello,awesome,world!

Отредактировано для добавления:

Вы можете получить последний элемент, выбирая длину массива минус 1:

>>> bits = "Hello awesome, world!".split(/[\s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"

... и если шаблон не соответствует:

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"
531
ответ дан Aaron Maenpaa 26 August 2018 в 02:31
поделиться

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

var splitFilePath = filePath.split(/[\/\\]/);
0
ответ дан AlliterativeAlice 26 August 2018 в 02:31
поделиться

Еще один простой, но эффективный метод заключается в том, чтобы повторно использовать split + join.

"a=b,c:d".split('=').join(',').split(':').join(',').split(',')

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

. Результат выражения:

['a', 'b', 'c', 'd']

. Расширяясь на этом, вы также можете поместить его в функцию:

function splitMulti(str, tokens){
        var tempChar = tokens[0]; // We can use the first token as a temporary join character
        for(var i = 1; i < tokens.length; i++){
            str = str.split(tokens[i]).join(tempChar);
        }
        str = str.split(tempChar);
        return str;
}

Использование:

splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]

Если вы используете эту функцию много, возможно, стоит даже рассмотреть возможность упаковки String.prototype.split для удобства (я думаю, что моя функция достаточно безопасна - единственное соображение дополнительные служебные данные условных выражений (minor) и тот факт, что ему не хватает реализации предельного аргумента, если массив передан).

Обязательно включите функцию splitMulti, если использовать этот подход к ниже просто обертывает его :). Также стоит отметить, что некоторые люди недовольны расширением встроенных модулей (поскольку многие люди делают это неправильно, и могут возникать конфликты), поэтому, если сомневаетесь, поговорите с кем-то старше, прежде чем использовать это или спросите о SO :)

    var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
    String.prototype.split = function (){
        if(arguments[0].length > 0){
            if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
                return splitMulti(this, arguments[0]);  // Call splitMulti
            }
        }
        return splitOrig.apply(this, arguments); // Call original split maintaining context
    };

Использование:

var a = "a=b,c:d";
    a.split(['=', ',', ':']); // ["a", "b", "c", "d"]

// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
        a.split('='); // ["a", "b,c:d"] 

Наслаждайтесь!

24
ответ дан Brian 26 August 2018 в 02:31
поделиться

Я думаю, что это проще, если вы укажете, что вы хотите оставить, а не то, что вы хотите удалить.

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

text.match(/[a-z'\-]+/gi);

Примеры (запуск фрагмента):

var R=[/[a-z'\-]+/gi,/[a-z'\-\s]+/gi];
var s=document.getElementById('s');
for(var i=0;i<R.length;i++)
 {
  var o=document.createElement('option');
  o.innerText=R[i]+'';
  o.value=i;
  s.appendChild(o);
 }
var t=document.getElementById('t');
var r=document.getElementById('r');

s.onchange=function()
 {
  r.innerHTML='';
  var x=s.value;
  if((x>=0)&&(x<R.length))
   x=t.value.match(R[x]);
  for(i=0;i<x.length;i++)
   {
    var li=document.createElement('li');
    li.innerText=x[i];
    r.appendChild(li);
   }
 }
<textarea id="t" style="width:70%;height:12em">even, test; spider-man

But saying o'er what I have said before:
My child is yet a stranger in the world;
She hath not seen the change of fourteen years,
Let two more summers wither in their pride,
Ere we may think her ripe to be a bride.

—Shakespeare, William. The Tragedy of Romeo and Juliet</textarea>

<p><select id="s">
 <option selected>Select a regular expression</option>
 <!-- option value="1">/[a-z'\-]+/gi</option>
 <option value="2">/[a-z'\-\s]+/gi</option -->
</select></p>
 <ol id="r" style="display:block;width:auto;border:1px inner;overflow:scroll;height:8em;max-height:10em;"></ol>
</div>

0
ответ дан ESL 26 August 2018 в 02:31
поделиться

Привет, например, если вы разделили и заменили в String 07:05:45 PM

var hour = time.replace("PM", "").split(":");

Результат

[ '07', '05', '45' ]
2
ответ дан Ezequiel García 26 August 2018 в 02:31
поделиться

. Легкий способ сделать это - обработать каждый символ строки с каждым разделителем и построить массив разделов:

splix = function ()
{
  u = [].slice.call(arguments); v = u.slice(1); u = u[0]; w = [u]; x = 0;

  for (i = 0; i < u.length; ++i)
  {
    for (j = 0; j < v.length; ++j)
    {
      if (u.slice(i, i + v[j].length) == v[j])
      {
        y = w[x].split(v[j]); w[x] = y[0]; w[++x] = y[1];
      };
    };
  };

  return w;
};

console.logg = function ()
{
  document.body.innerHTML += "<br>" + [].slice.call(arguments).join();
}

splix = function() {
  u = [].slice.call(arguments);
  v = u.slice(1);
  u = u[0];
  w = [u];
  x = 0;
  console.logg("Processing: <code>" + JSON.stringify(w) + "</code>");

  for (i = 0; i < u.length; ++i) {
    for (j = 0; j < v.length; ++j) {
      console.logg("Processing: <code>[\x22" + u.slice(i, i + v[j].length) + "\x22, \x22" + v[j] + "\x22]</code>");
      if (u.slice(i, i + v[j].length) == v[j]) {
        y = w[x].split(v[j]);
        w[x] = y[0];
        w[++x] = y[1];
        console.logg("Currently processed: " + JSON.stringify(w) + "\n");
      };
    };
  };

  console.logg("Return: <code>" + JSON.stringify(w) + "</code>");
};

setTimeout(function() {
  console.clear();
  splix("1.23--4", ".", "--");
}, 250);
@import url("http://fonts.googleapis.com/css?family=Roboto");

body {font: 20px Roboto;}

Использование: splix(string, delimiters...)

Пример: splix("1.23--4", ".", "--")

Возвраты: ["1", "23", "4"]

1
ответ дан harr-will 26 August 2018 в 02:31
поделиться

Давайте сделаем это простым: (добавьте «[] +» к вашему средству RegEx «1 или больше»)

Это означает, что «+» и «{1,}» совпадают.

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
11
ответ дан htmlfarmer 26 August 2018 в 02:31
поделиться

Вы можете передать регулярное выражение в оператор разделения Javascript . Например:

"1,2 3".split(/,| /) 
["1", "2", "3"]

Или, если вы хотите разрешить нескольким разделителям вместе действовать только один:

"1, 2, , 3".split(/(?:,| )+/) 
["1", "2", "3"]

(Вы должны использовать не захватывающий (? :) parens, потому что в противном случае он снова возвращается в результат. Или вы можете быть умным, как Aaron, и использовать класс символов.)

(Примеры, проверенные в Safari + FF)

133
ответ дан Jesse Rusak 26 August 2018 в 02:31
поделиться

Я использую regexp:

str =  'Write a program that extracts from a given text all palindromes, e.g. "ABBA", "lamal", "exe".';

var strNew = str.match(/\w+/g);

// Output: ["Write", "a", "program", "that", "extracts", "from", "a", "given", "text", "all", "palindromes", "e", "g", "ABBA", "lamal", "exe"]
-3
ответ дан Karthikeyan Vaithilingam 26 August 2018 в 02:31
поделиться

Начиная с решения @ stephen-sweriduk (это было более интересно для меня!), я немного изменил его, чтобы сделать более общим и многоразовым:

/**
 * Adapted from: http://stackoverflow.com/questions/650022/how-do-i-split-a-string-with-multiple-separators-in-javascript
*/
var StringUtils = {

  /**
   * Flatten a list of strings
   * http://rosettacode.org/wiki/Flatten_a_list
   */
  flatten : function(arr) {
    var self=this;
    return arr.reduce(function(acc, val) {
        return acc.concat(val.constructor === Array ? self.flatten(val) : val);
    },[]);
  },

  /**
   * Recursively Traverse a list and apply a function to each item
   * @param list array
   * @param expression Expression to use in func
   * @param func function of (item,expression) to apply expression to item
   *
   */
  traverseListFunc : function(list, expression, index, func) {
    var self=this;
    if(list[index]) {
        if((list.constructor !== String) && (list[index].constructor === String))
            (list[index] != func(list[index], expression)) ? list[index] = func(list[index], expression) : null;
        (list[index].constructor === Array) ? self.traverseListFunc(list[index], expression, 0, func) : null;
        (list.constructor === Array) ? self.traverseListFunc(list, expression, index+1, func) : null;
    }
  },

  /**
   * Recursively map function to string
   * @param string
   * @param expression Expression to apply to func
   * @param function of (item, expressions[i])
   */
  mapFuncToString : function(string, expressions, func) {
    var self=this;
    var list = [string];
    for(var i=0, len=expressions.length; i<len; i++) {
        self.traverseListFunc(list, expressions[i], 0, func);
    }
    return self.flatten(list);
  },

  /**
   * Split a string
   * @param splitters Array of characters to apply the split
   */
  splitString : function(string, splitters) {
    return this.mapFuncToString(string, splitters, function(item, expression) {
      return item.split(expression);
    })
  },

}

, а затем

var stringToSplit = "people and_other/things";
var splitList = [" ", "_", "/"];
var splittedString=StringUtils.splitString(stringToSplit, splitList);
console.log(splitList, stringToSplit, splittedString);

, который возвращает в качестве оригинала:

[ ' ', '_', '/' ] 'people and_other/things' [ 'people', 'and', 'other', 'things' ]
1
ответ дан loretoparisi 26 August 2018 в 02:31
поделиться

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

splitString = function(string, splitters) {
    var list = [string];
    for(var i=0, len=splitters.length; i<len; i++) {
        traverseList(list, splitters[i], 0);
    }
    return flatten(list);
}

traverseList = function(list, splitter, index) {
    if(list[index]) {
        if((list.constructor !== String) && (list[index].constructor === String))
            (list[index] != list[index].split(splitter)) ? list[index] = list[index].split(splitter) : null;
        (list[index].constructor === Array) ? traverseList(list[index], splitter, 0) : null;
        (list.constructor === Array) ? traverseList(list, splitter, index+1) : null;    
    }
}

flatten = function(arr) {
    return arr.reduce(function(acc, val) {
        return acc.concat(val.constructor === Array ? flatten(val) : val);
    },[]);
}

var stringToSplit = "people and_other/things";
var splitList = [" ", "_", "/"];
splitString(stringToSplit, splitList);

Пример выше возвращает: ["people", "and", "other", "things"]

Примечание: функция flatten была взята из Rosetta Code

7
ответ дан morten.c 26 August 2018 в 02:31
поделиться

Я не знаю производительности RegEx, но вот еще одна альтернатива для RegEx использует собственный HashSet и работает в сложности O (max (str.length, delimeter.length)):

var multiSplit = function(str,delimiter){
    if (!(delimiter instanceof Array))
        return str.split(delimiter);
    if (!delimiter || delimiter.length == 0)
        return [str];
    var hashSet = new Set(delimiter);
    if (hashSet.has(""))
        return str.split("");
    var lastIndex = 0;
    var result = [];
    for(var i = 0;i<str.length;i++){
        if (hashSet.has(str[i])){
            result.push(str.substring(lastIndex,i));
            lastIndex = i+1;
        }
    }
    result.push(str.substring(lastIndex));
    return result;
}

multiSplit('1,2,3.4.5.6 7 8 9',[',','.',' ']);
// Output: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]

multiSplit('1,2,3.4.5.6 7 8 9',' ');
// Output: ["1,2,3.4.5.6", "7", "8", "9"]
0
ответ дан Orhun Alp Oral 26 August 2018 в 02:31
поделиться

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

console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );

И выход будет:

["dasdnk", "asd", "naks", ":d", "skldma"]
5
ответ дан PeterKA 26 August 2018 в 02:31
поделиться

Возможно, вам нужно сделать какую-то замену строки, чтобы включить один разделитель в другой разделитель, чтобы у вас тогда был только один разделитель, чтобы иметь дело с вашим расколом.

3
ответ дан TheTXI 26 August 2018 в 02:31
поделиться

Трудный метод:

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
10
ответ дан user 26 August 2018 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: