scanf(" %c",&c);
или
scanf(" ");
//reading operation (gets(), fgets(stdin,...) etc)
Пробелы в строке формата scanf () будут игнорировать любые пробелы до первого не-пробела.
Передать в 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!"
Я считаю, что одной из основных причин, по которой мне это нужно, является разделение путей файла на обоих /
и \
. Это немного сложное регулярное выражение, поэтому я отправлю его здесь для справки:
var splitFilePath = filePath.split(/[\/\\]/);
Еще один простой, но эффективный метод заключается в том, чтобы повторно использовать 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"]
Наслаждайтесь!
for(var i = 0; i < tokens.length; i++)
, а не for(var i = 1; i < tokens.length; i++)
?
– tic
9 February 2018 в 19:35
tokens[1]
, чтобы сохранить одну итерацию как tokens[0] == tempchar
, и мы разделились на tempchar
после завершения итерации над tokens
, чтобы закончить. Я обновлю ответ, спасибо @tic :).
– Brian
10 February 2018 в 08:22
Я думаю, что это проще, если вы укажете, что вы хотите оставить, а не то, что вы хотите удалить.
Как будто вы хотите иметь только английские слова, вы можете использовать что-то вроде этого:
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>
Привет, например, если вы разделили и заменили в String 07:05:45 PM
var hour = time.replace("PM", "").split(":");
Результат
[ '07', '05', '45' ]
. Легкий способ сделать это - обработать каждый символ строки с каждым разделителем и построить массив разделов:
blockquote>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", ".", "--")
Возвраты:
blockquote>["1", "23", "4"]
Давайте сделаем это простым: (добавьте «[] +» к вашему средству RegEx «1 или больше»)
Это означает, что «+» и «{1,}» совпадают.
var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
Вы можете передать регулярное выражение в оператор разделения Javascript . Например:
"1,2 3".split(/,| /)
["1", "2", "3"]
Или, если вы хотите разрешить нескольким разделителям вместе действовать только один:
"1, 2, , 3".split(/(?:,| )+/)
["1", "2", "3"]
(Вы должны использовать не захватывающий (? :) parens, потому что в противном случае он снова возвращается в результат. Или вы можете быть умным, как Aaron, и использовать класс символов.)
(Примеры, проверенные в Safari + FF)
|
, как показывает Джесси.
– devios1
29 June 2012 в 22:36
Я использую 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"]
Начиная с решения @ 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' ]
Для тех из вас, кто хочет больше настроек в своей функции разделения, я написал рекурсивный алгоритм, который разбивает заданную строку со списком символов для разделения. Я написал это до того, как увидел этот пост. Я надеюсь, что это поможет некоторым разочарованным программистам.
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
Я не знаю производительности 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"]
Вы можете просто разбить все символы, которые вы хотите использовать в качестве разделителей, как сингулярно, так и коллективно, в регулярное выражение и передать их функции разделения. Например, вы можете написать:
console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );
И выход будет:
["dasdnk", "asd", "naks", ":d", "skldma"]
Возможно, вам нужно сделать какую-то замену строки, чтобы включить один разделитель в другой разделитель, чтобы у вас тогда был только один разделитель, чтобы иметь дело с вашим расколом.
Трудный метод:
var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
'('
для /(/g
, чтобы заменить все (
элементы - g
- это флаг global i> для RegExp - поэтому он ищет все вхождения (
не первый
– codename-
20 November 2013 в 13:33
+
. – Gumbo 16 March 2009 в 12:33