我有以下格式的数据。字符串可以按任意顺序排列,但一行最多只能有两个条目。
一行中也只能有一个条目。过去两天我一直在努力为下面的条件写一个正则表达式。
如果我用空格数拆分字符串,则值将被拆分。
如果我用)
分割字符串,如果值在第1行或第2行)
出现之前出现,则字符串不会被分割。
有什么建议吗?
我定义了下面的正则表达式来捕获字符串的不同部分。
\(([^)]+)\)
\(.+\)
但是,我无法构建与以下数据匹配的regex。
注意:在下面显示的7行中,每一行是一个输入字符串,而不是全部。
VALUE1 PARAMETER(VALUE2)
VALUE3 PARAMETER(VALUE4 WITH SPACES)
PARAMETER(VALUE5) VALUE6
PARAMETER(VALUE7 WITH SPACES) VALUE8
PARAMETER(VALUE9 WITH SPACES) PARAMETER(VALUE10)
VALUE11 VALUE12
PARAMETER(VALUE13 WITH SPACES)
作为
VALUE1
PARAMETER(VALUE2)
VALUE3
PARAMETER(VALUE4 WITH SPACES)
PARAMETER(VALUE5)
VALUE6
PARAMETER(VALUE7 WITH SPACES)
VALUE8
PARAMETER(VALUE9 WITH SPACES)
PARAMETER(VALUE10)
VALUE11
VALUE12
PARAMETER(VALUE13 WITH SPACES)
最佳答案
您需要使用可变宽度环视来检查多个空格是否不在括号内:
(?<!\([^)]*)\s+(?![^(]*\))
见RegexStorm Demo
正则表达式解释:
(?<!\([^)]*)
-检查空格前面是否没有开头(
和除)
以外的可选字符数(即,空格不在(
之后)的负数。\s+
-如果要排除制表符和其他与\p{Zs}
匹配的空白符号,您可以将其限制为只包含\s
速记Unicode类的空格,这将被占用并在拆分后排除在最终数组之外)(?![^(]*\))
-一个否定的展望,确保除了(
之外没有可选的字符数,然后在空白之后)
(即在空白之后没有)
)。第1点和第3点确保我们检查了括号的空白两边。
您可以将此正则表达式与
Regex.Split()
一起使用。var rx = new Regex(@"(?<!\([^)]*)\s+(?![^(]*\))");
var txt = @"YOUR TEXT";
var reslt = rx.Split(txt);