【发布时间】:2014-07-11 09:21:14
【问题描述】:
我的问题很复杂,但可以归结为一个简单的例子。
我正在编写一种自定义查询语言,用户可以在其中输入我解析为 LinQ 表达式的字符串。
我想做的是用* 字符分割字符串,除非它被正确转义。
Input Output Query Description
"*\\*" --> { "*", "\\", "*" } -- contains a '\'
"*\\\**" --> { "*", "\\\*", "*" } -- contains '\*'
"*\**" --> { "*", "\*", "*" } -- contains '*' (works now)
我不介意 Regex.Split 返回空字符串,但我最终得到了这个:
Regex.Split(@"*\\*", @"(?<!\\)(\*)") --> {"", "*", "\\*"}
如您所见,我尝试了消极的后视,它适用于我的所有情况,除了这个。我也试过Regex.Escape,但没有运气。
显然,我的问题是我正在寻找 \*,与 \\* 匹配。但在这种情况下,
\\ 是另一个转义序列。
任何解决方案都不必涉及正则表达式。
【问题讨论】:
-
+1 将问题的本质提炼成一个很好的问题。
-
在本例中,您可以匹配
(\*)(\\\\)(\*)之类的内容以在匹配中获得三个组。这是在现实世界场景中使用拆分的可接受替代方案吗? -
你能告诉我们一些不同的情况以及如何解析它们吗?所以我们不会搞砸你原来的(和有效的)解决方案?
-
我已经用另一个例子更新了这个问题。
-
如果你想用(未转义的)
*字符分割字符串,你的例子#2不应该是这样吗?"*\\\**" --> { "*", "\\\*", "*" }