按字符拆分字符串,但跳过特定字符组合

4

假设我有一个字符串,格式如下:

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

我想将这个字符串拆分成以下子字符串:"First", "Second//Third", "Fourth"。基本上,我想通过一个字符(在这种情况下为/)来拆分字符串,但不通过该字符的两倍(在这种情况下为//)。 我考虑了很多方法,但无法使其正常工作。

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

谢谢!

编辑:我希望得到一个简单的解决方案。我已经考虑了逐个字符解析字符串,但在我的实际使用中,这太复杂了。


1
需要编写自定义逻辑,我认为没有内置机制来实现它AFAIK。 - TalentTuner
4个回答

10

您可以尝试使用这个C#解决方案,它使用正向回顾和正向预查:

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

它说:分隔符是/,前面是除了/以外的任何字符,后面是除了/以外的任何字符。

这里有另一个更短的版本,使用了负向回顾和预测:

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

这句话的意思是:定界符为/,它不以/开头,也不以/结尾。
你可以在这里了解更多关于“环视”的信息。

谢谢!它很好用!当选项可用时,我会标记您的答案。 - Adrian Marinica
我不确定您想如何处理,但这里使用正向先行断言意味着它不会在输入的开头或结尾的斜杠处拆分。(因为它正在寻找“紧挨着两个非斜杠”,而不是“不紧挨着斜杠”)。 - Rawling
1
@Rawling,我添加了带有负向先行断言的版本,除了你说的之外,我认为负向先行断言版本更短,更易读。 - Ivan Golović
你能解释一下为什么前瞻需要 <,但后顾不需要吗? - zer0ne
@zer0ne < 用于表示向后查找,它是一种语法符号,可以清楚地表明这个模式实际上是负向后查找,如果没有它,语法将与正向先行断言相同。 - Ivan Golović

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

3

好的,您可以根据/拆分字符串。返回的数组将包含所有使用//的空位置。循环遍历数组,在指向空位置的i处连接i-1i+1的内容。


如果正则表达式不是一个选项,那么这是一个好的解决方案。我将使用Ivan G的答案。我也给你点赞了。 - Adrian Marinica

2
这个怎么样:
var array = "First/Second//Third/Fourth".replace("//", "%%").split("/");

array.forEach(function(element, index) {
    array[index] = element.replace("%%", "//");
});

我想过这个,但是字符串(如First、Second等)也可以使用“%%”。最终结果可能会出现不需要的字符串。不过还是谢谢你的建议! - Adrian Marinica
然后使用一个非常非常不可能出现的字符串。 - Amberlamps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接