gpt4 book ai didi

c# - 在/不在 [ ] 内拆分字符串

转载 作者:太空狗 更新时间:2023-10-29 22:25:36 25 4
gpt4 key购买 nike

我正在尝试拆分表示 XPath 的字符串,例如:

string myPath = "/myns:Node1/myns:Node2[./myns:Node3=123456]/myns:Node4";

我需要在 '/' 上进行拆分(结果中排除了 '/',就像正常的字符串拆分一样),除非 '/' 恰好位于 '[ ... ]' 内(其中 '/'既不会拆分,也不会包含在结果中)。

那么普通的 string[] result = myPath.Split("/".ToCharArray()) 让我明白了:

result[0]: //Empty string, this is ok
result[1]: myns:Node1
result[2]: myns:Node2[.
result[3]: myns:Node3=123456]
result[4]: myns:Node4

results[2]result[3] 本质上应该结合起来,我应该以:

result[0]: //Empty string, this is ok
result[1]: myns:Node1
result[2]: myns:Node2[./myns:Node3=123456]
result[3]: myns:Node4

因为我对正则表达式不是很流利,所以我尝试在拆分后手动将结果重新组合到一个新数组中,但让我担心的是,虽然让它在这个例子中工作很简单,但正则表达式似乎在我获得更复杂的 xpath 的情况下更好的选择。

作为记录,我查看了以下问题:
Regex split string preserving quotes
C# Regex Split - commas outside quotes
Split a string that has white spaces, unless they are enclosed within "quotes"?

虽然他们应该足以帮助解决我的问题,但我遇到了一些问题/令人困惑的方面,使他们无法帮助我。
在前 2 个链接中,作为正则表达式的新手,我发现它们很难解释和学习。他们正在寻找左右对之间看起来相同的引号,因此将其翻译为 [ 和 ] 使我感到困惑,反复试验并没有教给我任何东西,相反,它只是让我更加沮丧。我能理解相当基本的正则表达式,但这些答案的作用比我目前理解的要多一点,即使在第一个链接中有解释。
在第三个链接中,我将无法访问 LINQ,因为代码将在旧版本的 .NET 中使用。

最佳答案

XPath 是一种复杂的语言,在许多情况下尝试在底层的斜杠上拆分 XPath 表达式会失败,示例:

/myns:Node1/myns:Node2[./myns:Node3=123456]/myns:Node4
string(/myns:Node1/myns:Node2)

我建议采用其他方法来涵盖更多案例。不要尝试拆分,而是尝试使用 Regex.Matches(String, String) 方法匹配斜线之间的每个部分。这种方式的好处是你可以自由描述这些部分的外观:

string pattern = @"(?xs)
[^][/()]+ # all that isn't a slash or a bracket
(?: # predicates (eventually nested)
\[
(?: [^]['""] | (?<c>\[) | (?<-c>] )
| "" (?> [^""\\]* (?: \\. [^""\\]* )* ) "" # quoted parts
| ' (?> [^'\\]* (?: \\. [^'\\]* )* ) '
)*?
(?(c)(?!$)) # check if brackets are balanced
]
| # same thing for round brackets
\(
(?: [^()'""] | (?<d>\() | (?<-d>\) )
| "" (?> [^""\\]* (?: \\. [^""\\]* )* ) ""
| ' (?> [^'\\]* (?: \\. [^'\\]* )* ) '
)*?
(?(d)(?!$))
\)
)*
|
(?<![^/])(?![^/]) # empty string between slashes, at the start or end
";

注意:为了确保字符串被完全解析,您可以在模式的末尾添加类似:|\z(?<=(.)) 的内容。这样,您可以测试捕获组是否存在以了解您是否在字符串的末尾。 (但是你也可以使用匹配位置,长度和字符串的长度。)

demo

关于c# - 在/不在 [ ] 内拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40870995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com