【问题标题】:Split string data into array based on new line and then double digit number根据换行符将字符串数据拆分为数组,然后是两位数
【发布时间】:2010-06-18 20:31:58
【问题描述】:

我要做的是将字符串中的数据拆分成一个数组。

以下是文本格式的大致思路...

xxxxx 表示字母-数字-空白数据的任意组合。

xxxxx
 1 xxxxxxxxxx
 2 xxxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxx
 3 xxxxxxxxxx
 4 xxxxxxxxxx
xxxxxxxxxx
 5 xxxxxxxxxx

(当数字进入两位数时,十位进入数字前面的空白位置)

现在我想做的是有一个由 5 个元素组成的数组(在这种情况下),它存储数字和所有跟踪的数据(包括新行)。在过去,这没什么大不了的,我可以使用 string.split("\n") ,但现在我需要基于某种正则表达式(如 /\n [0-9]{1,2}/ () 不支持正则表达式)。

我希望数组是这样的

array[1] = " 1 xxxxxxxxxx"
array[2] = " 2 xxxxxxxxxxx\nxxxxxxxxxx\nxxxxxxxxxx"
array[3] = " 3 xxxxxxxxxx"
...etc

【问题讨论】:

  • xxxxx denotes any mix of alpha-numeric-whitespace data - 如果其中一个 xxxx 是 `4 asdasdasd`,你会怎么做?它如何理解新部分在哪里,旧部分在哪里?

标签: javascript regex string


【解决方案1】:

split() 确实支持正则表达式。试试这个:

text.split(/\n(?=[1-9 ][0-9] )/)

【讨论】:

  • 嗯,似乎我正在阅读的文档没有提到这一点,我认为它是准确的并且从未尝试过。走吧。
【解决方案2】:

您可以在(?= [1-9] |[1-9][0-9] ) 上使用前瞻和拆分,可能锚定在行首,但xxxx 部分可能存在歧义问题。这也不能确保编号是连续的。

示例

var text =
  "preface\n" +
  " 1 intro\n" +
  " 2 body\n" +
  "more body\n" +
  " 3 stuff\n" +
  "more stuff\n" +
  "even 4 stuff\n" +
  "10 conclusion\n" +
  "13 appendix\n";

print(text.split(/^(?= [1-9] |[1-9][0-9] )/m));

输出是(as seen on ideone.com):

preface
, 1 intro
, 2 body
more body
, 3 stuff
more stuff
even 4 stuff
,10 conclusion
,13 appendix

【讨论】:

  • 我的问题是我不能在 string.split() 中使用正则表达式...是的,里面有很多数字,但我可以告诉你,它们总是被填充的如上面在此模式中所述:一个新行,一个空白(或一个数字),一个数字,一个空白,然后是其余数据。
  • @user:你为什么不能使用正则表达式?你用的是javascript,是吗?
  • 也许更可读的输出,除了replace之外还有splitideone.com/JwhoC;如果你至少可以做正则表达式replace,那么你可以做这样的事情,在其中插入一个文字字符串分隔符,然后在该文字字符串上插入split
【解决方案3】:

正如@polygenelubricants 所说,您可以使用带有替换的正则表达式并制作一个临时分隔符,然后在该分隔符上拆分并将其删除。

这是您在上面给出的字符串中的一个工作示例,以及我为测试该函数而制作的另一个示例。它适用于两者。由于您没有提供任何真实数据作为示例,因此我无法对其进行测试,但希望这至少能让您走上正确的道路。

function SplitCrazyString(str) {
    var regex = /(\n\s?\d+\s[^(\n\s?\d+)]+)/mg;

    var tempStr = str.replace(regex, "~$1");

    var ary = tempStr.split('~');

    for (var i = 0; i < ary.length; i++) {
        ary[i].replace('~', '');
    }

    return ary;
}
var x = "xxxxx\n" +
    " 1 xxxxxxxxxx\n" +
    " 2 xxxxxxxxxx\n" +
    "xxxxxxxxx\n" +
    "xxxxxxxxx\n" +
    "xxxxxxxx\n" +
    " 3 xxxxxxxxxx\n" +
    " 4 xxxxxxxxxx\n" +
    "xxxxxxxxxx\n" +
    " 5 xxxxxxxxxx\n";
var testStr = "6daf sdf84 as96\n" +
    " 1 sfs 4a8dfa sf4asf\n" +
    " 2 s85 d418 df4 89 f8f\n" +
    "65a1 sdfa48 asdf61\n" +
    "w1c 987a w1ec\n" +
    "a6s85 d1a6f 81sf\n" +
    " 3 woi567 34ewn23 5cwe6\n" +
    " 4 s6k 8hf6 9gd\n" +
    "axxm4x1 dsf615g9 8asdf1jt gsdf8as\n" +
    " 5 n389h c8j923hdha 8h3x982qh\n";

var xAry = SplitCrazyString(x);
var testAry = SplitCrazyString(testStr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多