2

我有这样的声明:

blah
blah
John 做了这个
blah
blah
John 做了那个
等等。

我需要在以 John 开头的行末尾的换行符处拆分此文本。John 之后的文本不一致,但最后一行始终以 John 开头。在“John”处拆分它很容易,我只是不知道如何说“在 John 之后的下一个换行符处拆分”。

.split(/(.*?John*?\n)+/g)

当我希望它与上面的东西保持一致时,上面将它与 John 分开,成为它自己的条目。

编辑

输出应该是:

(废话
约翰
做了这个)

废话
约翰做了那个)
(等等......

其中括号表示分割边界/单个数组条目。

4

3 回答 3

1

这应该有效:

s = "blah\n" +
"blah\n" +
"John did this\n" +
"blah\n" +
"blah\n" +
"John did that";

m = s.match(/[\s\S]*?\bJohn\b[^\n]*/g);

console.log(m);

输出:

["blah
blah
John did this", "
blah
blah
John did that"]
于 2013-11-04T18:36:11.720 回答
1

我认为它会为你工作:

.split(/.+John.+\n/g)

.任何元素

+1次或多次

John

.+任何元素 1 次或多次

\n新队

g全球的。不要停留在第一次分裂。

编辑

有了这个:.split(/(.*?John*?\n)+/g),你正在匹配:

.*任何元素 0 次或多次

John*?约翰 0 次以上。?这里没有意义。

\n新队

因此,在 John 或新行之后,除了 John 之外,这不匹配任何内容。

于 2013-11-04T18:29:35.650 回答
0

我会这样做:

var splitted = text.match(/[^]+?John.+\n/g);
  • [^]+?→ 任何 char(但至少一个 char)不情愿,这样它就不会消耗 John
  • .+\n→ 与约翰在同一行中的每个字符

正如@anubhava 建议的那样,您可以将[\s\S]其用于任何字符,\b如果您不使用Jonhy. 如果您想匹配空字符串,请替换+*,如果您不想包含新行,只需使用[^\n]+(除新行之外的所有字符)。


工作小提琴

于 2013-11-04T18:49:05.727 回答