Javascript - простой способ разделить / разделить строку по шаблону на N частей, где последняя часть является остатком строки - PullRequest
2 голосов
/ 24 марта 2011

Если у меня есть строки:

string1 = "1 secondpart this is the third part"
string2 = "14   secondpartagain   third part   again"

, и я хочу разделить их по шаблону (например, пробел) на N частей (например, 3 части), то результат должен быть примерно таким:

part1: "1", part2: "secondpart", part3: "this is the third part"
  -and
part1: "14", part2: "secondpartagain", part3: "third part   again"

В Ruby я бы сделал что-то вроде:

part1, part2, part3= string1.split(/\s+/, 3)

Если я использую функцию разделения в Javascript, я получу что-то вроде этого:

var myArray1 = string1.split(/\s+/, 3);
var myArray2 = string2.split(/\s+/, 3);

myArray1[0]: "1", myArray1[1]: "secondpart", myArray1[2]: "this"
  -and
myArray2[0]: "14", myArray2[1]: "secondpartagain", myArray2[2]: "third"

Что такоеСамый простой способ разбить строку по шаблону на N частей, где последняя часть является остатком строки?

Ответы [ 5 ]

0 голосов
/ 24 марта 2011

Я автор оригинального вопроса. В моем конкретном случае это num_parts = 3 иdiv_pattern = пробел. В этом случае Мартейнс ответит хорошо.

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

Я сделал комбинацию из двух предыдущих ответов, которая должна работать как некая обобщенная сплит-функция. Этот принимает слова, но может быть легко изменен для принятия других шаблонов:

function divideString(orig_string, divide_pat, num_parts) {
    var regExPattern = /^\s*/.source;
    for (var i = 0; i < num_parts - 1; i++) {
        regExPattern += /(\w+)/.source + divide_pat.source;
    }
    regExPattern += /(.*)$/.source;
    var re = new RegExp(regExPattern); 

    var match = re.exec(orig_string);
    if (match) {
        return match.slice(1, num_parts+1);
    }
}

var string2 = "14   secondpartagain   third part   again";

alert( divideString(string2, /\s+/, 3) );
0 голосов
/ 24 марта 2011

Если вы хотите разделить первые два (группы) пробелов:

function splitString(text) {
    var rexSplitter = /^(\S*)\s+(\S*)\s+(.*)$/,
        match = rexSplitter.exec(text);
    if (match) {
        return Array.prototype.slice.call(match, 1, 3);
    } 
}

или, если вы используете короткий код:

function splitString(text) {
     var match = /^(\S*)\s+(\S*)\s+(.*)$/.exec(text);
     return match && Array.prototype.slice.call(match, 1, 3);
}
0 голосов
/ 24 марта 2011

Если вам нравится один лайнер, вы можете сделать это:

var str = "1 secondpart this is the third part";
var arr = str.split(/\s+/,2).concat(str.replace(/^\s*\S+\s+\S+\s+/,''));
0 голосов
/ 24 марта 2011
function partitioner(original, pattern, num_parts, c) {
    var parts = original.split(pattern);
    var result = [];

    for (var i = 0; i < num_parts - 1 && parts.length > 0; i++) {
        var part = parts.shift();
        result.push(part);
    }

    result.push(parts.join(c));

    return result;
}

var string1 = "1 secondpart this is the third part";
var splitted = partitioner(string1, /\s+/, 3, ' ');
console.log(splitted);
0 голосов
/ 24 марта 2011

См. Документы Java по разделению строк: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String)

Он должен делать то, что вам нужно, и я на 100% уверен, что это работает в сценарии Java.

var s="1 secondpart this is the third part";
        var d=s.split(" ");
        var l=d.length;
        document.writeln("<p> Length:"+l+"</p>");
        for(var i=0; i<l; i++){
            document.writeln("<p> "+i+":"+d[i]+"</p>");
        }

        document.writeln("<p> End </p>");
...