【问题标题】:Split string by char, but skip certain char combinations按字符拆分字符串,但跳过某些字符组合
【发布时间】:2013-02-27 09:40:32
【问题描述】:

假设我有一个类似于以下形式的字符串:

"First/Second//Third/Fourth"(注意SecondThird之间的双斜线)

我希望能够将此字符串拆分为以下子字符串"First", "Second//Third", "Fourth"。基本上,我想要的是将字符串拆分为一个字符(在本例中为/),而不是由该字符的两倍(在本例中为//)。我虽然以多种方式对此进行了思考,但无法使其正常工作。

我可以使用 C# 和/或 JavaScript 中的解决方案。

谢谢!

编辑:我想要一个简单的解决方案。我已经想过逐个字符地解析字符串,但是在我的实际使用中这太复杂了。

【问题讨论】:

  • 需要编写自定义逻辑,我不认为它有内置机制 AFAIK

标签: c# javascript string split


【解决方案1】:

试试这个 C# 解决方案,它使用正向后视和正向前瞻:

        string s = @"First/Second//Third/Fourth";
        var values = Regex.Split(s, @"(?<=[^/])/(?=[^/])", RegexOptions.None);

它说:定界符是/,它前面是除/ 之外的任何字符,后面是除/ 之外的任何字符。

这是另一个较短的版本,它使用负后瞻和前瞻:

        var values = Regex.Split(s, @"(?<!/)/(?!/)", RegexOptions.None);

这说:分隔符是/,它前面没有/,后面也没有/

您可以了解有关“环视”的更多信息here

【讨论】:

  • 谢谢!效果很好! Will mark your answer when the option will be available.
  • 我不确定你想如何处理它,但是这里使用 positive 环顾意味着这 不会 在斜线在输入的开始或结束。 (因为它正在寻找“在两个非斜杠旁边”而不是“不在斜杠旁边”。)
  • @Rawling 我添加了负面环视的版本,除了你说的,负环视版本更短,在我看来,更具可读性。
  • 您能解释一下为什么前瞻需要
  • @zer0ne &lt; 用于表示lookbehind,它是一个语法符号,可以清楚地表明这种模式实际上是负向lookbehind,没有它,语法将与正向lookahead相同。跨度>
【解决方案2】:

在 .NET 正则表达式中,您可以使用否定断言来实现。(?&lt;!/)/(?!/) 将起作用。使用Regex.Split方法。

【讨论】:

    【解决方案3】:

    好的,您可以做的一件事是根据/ 拆分字符串。您返回的数组将包含所有使用 // 的位置的空分配。遍历数组并连接i-1i+1 分配,其中i 是指向空分配的指针。

    【讨论】:

    • 如果 RegEx 不是一个选项,这是一个很好的解决方案。我将使用 Ivan G 的答案。也赞成你的。
    【解决方案4】:

    这个怎么样:

    var array = "First/Second//Third/Fourth".replace("//", "%%").split("/");
    
    array.forEach(function(element, index) {
        array[index] = element.replace("%%", "//");
    });
    

    【讨论】:

    • 我想到了,但字符串(First、Second 等)也可以使用“%%”。我可能会在最终结果中得到不需要的字符串。不过,谢谢你的想法!
    • 然后使用一个非常非常不可能出现的字符串。
    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多