regex 拆分字符串并保留新行

rqdpfwrv  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(166)

我试图将一个字符串最终拆分成一个二维数组,用分号作为分隔符。

var str = "2;poisson
            poisson
           3; Fromage
           6;Monique"

var arr = [2, "poisson
               poisson"],
          [3," Fromage"],
          [6,"Monique"]

数组的格式为

[int, string that may start with white space and may end with possible new lines]

第一步是通过regex,但是,使用(\d+\;\s?)(.)+并不能用一个新的.Regex101行来抓取行。
我有点困惑如何继续,因为换行符/回车很重要,我不想失去它们。我的RegEx Fu今天很弱。

bvpmtnay

bvpmtnay1#

使用Javascript,您可以使用2个撷取群组:

\b(\d+);([^]+?)(?=\n\s*\d+;|$)

模式匹配:

  • \b字边界
  • (\d+);捕获组1,捕获1+个数字,然后匹配;
  • (捕获组2
  • [^]+?匹配任意字符(包括换行符)1次以上
  • )关闭”组
  • (?=正前瞻,Assert右边是什么
  • \n\s*\d+;|$匹配换行符后跟可选空格字符和第一个模式,或者匹配字符串的结尾
  • )关闭前瞻

Regex demo

const str = `2;poisson
            poisson
           3; Fromage
           6;Monique`;

const regex = /\b(\d+);([^]+?)(?=\n\s*\d+;|$)/g;
console.log(Array.from(str.matchAll(regex), m => [m[1], m[2]]))
xesrikrc

xesrikrc2#

下面是一个简短而简洁的解决方案,可以通过两个嵌套的.split()来获得结果:

const str = `2;poisson
    poisson
3; Fromage
6;Monique`;
let result = str.split(/\n(?! )/).map(line => line.split(/;/));
console.log(JSON.stringify(result));

输出量:

[["2","poisson\n    poisson"],["3"," Fromage"],["6","Monique"]]

第一个拆分正则表达式的解释:

  • \n-换行符(可能更改为[\r\n]+以支持Windows换行符
  • (?! )-空间的负先行查找

相关问题