【发布时间】:2012-12-17 06:56:43
【问题描述】:
我正在解析 C# 中的一些输入,但我在使用 RegEx 处理时遇到了困难。
免责声明:我不是正则表达式专家,但我正在学习更多。
我有一个如下所示的输入字符串:
ObjectType [property1=value1, property2=value2, property3=AnotherObjectType [property4=some value4]]
(一个人为的值,但重要的是这些可以嵌套)。
我正在执行以下操作来标记字符串:
Regex Tokenizer = new Regex(@"([=\[\]])|(,\s)");
string[] tokens = Tokenizer.Split(s);
这让我完成了大约 98% 的工作。这会将字符串拆分为已知的分隔符,逗号后跟一个空格。
上例中的记号是:
ObjectType
[
property1
=
value1
,
property2
=
value2
,
property3
=
AnotherObjectType
[
property4
=
some value4
]
]
但我有两个问题:
1) 属性值可以包含逗号。这是一个有效的输入:
ObjectType [property1=This is a valid value, and should be combined,, property2=value2, property3=AnotherObjectType [property4=value4]]
我希望 property1= 之后的标记是:
This is a valid value, and should be combined,
我希望保留令牌内的空格。目前,找到逗号时将其拆分。
2) 拆分时,逗号标记包含空格。如果可能的话,我想摆脱它,但这是一个不太重要的优先事项。
我尝试了各种选择,但它们都让我部分实现了目标。我所拥有的最接近的是:
Regex Tokenizer = new Regex(@"([=\[\]])|(,\s)|([\w]*\s*(?=[=\[\]]))|(.[^=]*(?=,\s))");
为了匹配分隔符,逗号后跟一个空格,单词字符后跟一个文字前的空格,以及逗号和空格之前的文本(不包括 = 符号)。
当我得到匹配而不是调用 split 时,我得到了这个:
ObjectType
[
property1
=
value1
,
property2
=
value2
,
property3
=
AnotherObjectType
[
property4
=
value4
]
]
请注意属性 4 中缺少的信息。更复杂的输入有时会在令牌中包含右括号,如下所示:value4] 我不确定为什么会这样。关于如何改进这一点的任何想法?
谢谢, 菲尔
【问题讨论】:
-
不要觉得你需要使用单个正则表达式来解决这个问题;如果它更容易解决,那么使用多个正则表达式来解决问题是完全可以的。那是除非性能成为问题,但我更愿意先使其正确。
-
属性值是否可以包含'='、'['或']'字符而不是嵌套对象?换行符呢?基本上,你确定你可以可靠地解析这种格式吗?
-
从技术上讲,属性值可以包含所有分隔符,尽管这不太可能。
-
@Patrick - 这是一个愚蠢的问题,但多个正则表达式的方法是什么?
-
你想试试正则表达式求值器类吗?