javascript正则表达式在char上拆分匹配,而不是多次

sve*_*ens 3 javascript regex split match

有以下示例:

var s = '#hello \n##1234 \n #hello2';
var splits = s.split(/#[^##]/);
Run Code Online (Sandbox Code Playgroud)

生产: ["", "ello ?#", "234 ? ", "ello2"]

但是想要它产生: ["hello ?##1234 ? ", "hello2"]

如何匹配单个出现的字符(#),但如果它出现多次,则不是,也不是最后一次出现的多个字符.

Wik*_*żew 5

有了split,你需要一个负回顾后,以防止匹配#陆续自带#,但JavaScript不支持lookbehinds.

匹配块而不是分割.match(/(?:##+|[^#])+/g),将匹配1次或多次2+ #或除以下之外的任何字符#:

var s = '#hello \n##1234 \n #hello2';
var splits = s.match(/(?:##+|[^#])+/g);
console.log(splits);
Run Code Online (Sandbox Code Playgroud)

图案细节:

  • (?:##+|[^#])+- 1次或多次出现(+):
    • ##+- #尽可能多的2个或更多符号
    • [^#]- 除#(a 之外的任何字符[^...]都是一个否定的字符类,它匹配任何不在定义的集合/范围内的单个字符).

注意:[^##]是相同的[^#],你不能否定具有否定字符类的序列,只能否定特定字符或字符范围.