【问题标题】:Use of capturing group in .split() function在 .split() 函数中使用捕获组
【发布时间】:2016-11-28 11:34:37
【问题描述】:

我有一个字符串,我想使用 '|' 将其拆分为数组字符但不是'\|':

var a = 'abc\&|\|cba';
var b = a.split(/([^\\])\|/);

结果:

b = ["abc", "&", "|cba"]

预期输出:

b = ["abc\&", "\|cba"]

基本上我无法在 .split() 函数中正确使用捕获组。

【问题讨论】:

  • 澄清一下:你有var a = 'abc\\&|\\|cba'; (=abc\&|\|cba) 还是真的var a = 'abc\&|\|cba'; (=abc&||cba)?此外,这里不需要捕获组,您需要后视,但由于 JS 正则表达式风格中缺少它,因此您需要 match 您需要的字符串。
  • 如果需要用“|”分隔提取的单词您是否故意只需要以["abc\&", "cba"] 之类的字母开头的拆分词?否则您的数组将根据您的字符串变量 a -> ["abc\&", "\", "cba"] 拆分如下
  • @WiktorStribiżew - 我有 'abc\&|\|cba 是单转义。

标签: javascript regex split regex-negation capturing-group


【解决方案1】:

您可以使用积极的前瞻进行拆分。

带有转义的反斜杠

var a = 'abc\\&|\\|cba';
var b = a.split(/\|(?=\\)/);
console.log(b);

没有转义的反斜杠

/\|(?=\|)/

  • \| 匹配字符 | 字面意思

  • (?=\|) Positive Lookahead - 断言下面的正则表达式可以匹配

    • \| 匹配字符 | 字面意思

基本上它会寻找一个管道,如果有另一个管道在后面,它就会分裂。

var a = 'abc\&|\|cba';
var b = a.split(/\|(?=\|)/);
console.log(b);

【讨论】:

  • 我认为这不是 OP 所需要的(用非转义管道分割)
  • 这正是我想要的。你能解释一下你的第二个解决方案吗? @Nina Scholz
【解决方案2】:

我假设您的字符串中有文字 \,并且您的问题在输入字符串文字中包含拼写错误。在 JS C 字符串中,您需要使用双 \ 来定义文字反斜杠(因为在常规字符串文字中,您可以定义转义序列,如 \r\n 等)。

您的正则表达式需要匹配除\| 或任何文字\ 后跟任何字母以外的所有字符。如果您的字符串可以等于文字 \,则需要

var a = 'abc\\&|\\|cba';
b = a.match(/(?:[^\\|]|\\.?)+/g);
console.log(b);

模式匹配:

  • (?: - (非捕获交替组的开始)
    • [^\\|] - 除\| 之外的任何字符
    • | - 或
    • \\.? - \ 后跟任意 1 或 0 个字符,但换行符
  • )+ - 1 次或更多次

【讨论】:

  • 但我实际上有单转义而不是双转义。怕是做不到吧? :(
  • 不,这是不可能的,因为您要么将它们作为文字符号,要么没有。
【解决方案3】:

您可以使用正则表达式执行以下操作,将每个识别的单词(在本例中为价格)存储在一个数组中,然后在需要时抓取它

var re = /(?:^|[ ])|([a-zA-Z]+)/gm;
var str = 'abc\&|\|cba';
var identifiedWords;

while ((identifiedWords = re.exec(str)) != null) 
{
    if (identifiedWords.index === re.lastIndex) 
    {
        re.lastIndex++;
    }
// View your result using the "identifiedWords" variable.
// eg identifiedWords[0] = abc\&
// identifiedWords[1] = cba

}

【讨论】: