C# 正则表达式拆分的行为不符合预期

C# 正则表达式拆分的行为不符合预期,c#,regex,C#,Regex,我有一个字符串,它是csv中的一行。此字符串包含许多值,其中一个值的结构如下 {X=4535.12,Y=4535.12}{X=12345,Y=12345}等等 我正在使用正则表达式分割这个字符串,但到目前为止还没有成功地使用这个模式 /(({X=\d+\.\d+, Y=\d+\.\d+})|({X=\d+, Y=\d+})|({X=\d+\.\d+, Y=\d+})|({X=\d+, Y=\d+\.\d+}))+/g 我在一个网站上测试了它,它与我想要的字符串完全匹配,在大量数据中没有其他字符

我有一个字符串,它是csv中的一行。此字符串包含许多值,其中一个值的结构如下

{X=4535.12,Y=4535.12}{X=12345,Y=12345}等等

我正在使用正则表达式分割这个字符串,但到目前为止还没有成功地使用这个模式

/(({X=\d+\.\d+, Y=\d+\.\d+})|({X=\d+, Y=\d+})|({X=\d+\.\d+, Y=\d+})|({X=\d+, Y=\d+\.\d+}))+/g
我在一个网站上测试了它,它与我想要的字符串完全匹配,在大量数据中没有其他字符串,但是当我使用它进行拆分时,拆分只给出一个值(整个字符串作为一个值)

我缺少的
Split
是否有某种功能导致其行为与标准匹配不同,还是我的模式不正确

C#中的这行是这样写的

string[] tempLine = System.Text.RegularExpressions.Regex.Split(line, @"/(({X=\d+\.\d+, Y=\d+\.\d+})|({X=\d+, Y=\d+})|({X=\d+\.\d+, Y=\d+})|({X=\d+, Y=\d+\.\d+}))+/g");

首先,您的正则表达式过于复杂,您可以将其简化为:

({X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?})
下面是生成的C代码:


首先,您的正则表达式过于复杂,您可以将其简化为:

({X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?})
下面是生成的C代码:

试一试

试一试


我用这个正则表达式字符串解决了这个问题

((?:{X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?})+)

这是@Thomas give答案的一个稍加编辑的版本,因此我将把他的答案标记为答案,因为这有助于我找到解决方案,他的答案更一般,更有可能帮助其他人解决这个问题

我使用这个正则表达式字符串解决了这个问题

((?:{X=\d+(?:\.\d+)?, Y=\d+(?:\.\d+)?})+)

这是@Thomas给出的答案的略加编辑的版本,因此我将把他的答案标记为答案,因为这有助于我找到解决方案,他的答案更一般,更有可能帮助任何其他人解决这个问题

是否要将坐标每x拆分一次,y?在c#中执行拆分的代码行是什么?它可能有些古怪syntax@BadroNiaimi我想将整行内容与行的其余部分分开,它包含逗号,应该删除这些逗号。@Isaac编辑了一个问题,包括如果您只想提取这些值,为什么不使用简单的
[0-9]+\.?[0-9]来提取它们呢+
regular exp,然后将偶数值分配给x,将奇数分配给y?是否要对每个x,y的坐标进行分割?在c#中执行分割的代码行是什么?它可能有些古怪syntax@BadroNiaimi我想将整行内容与行的其余部分分开,它包含逗号,应该删除这些逗号。@Isaac编辑了一个问题,包括如果您只想提取这些值,为什么不使用简单的
[0-9]+\.?[0-9]来提取它们呢+
regular exp,然后将偶数值赋给x,将奇数赋给y?我会使用
@“{x=[\d.]+,\s+y=[\d.]+}”
regex。匹配的浮点值的有效性在这里不应该是一个问题。这不是我想要的,很抱歉,如果我没有很好地指定,我希望将整个数据集分开,因此如果数据像hello,{X=4535.12,Y=4535.12}{X=12345,Y=12345},再见-我想要一个包含三个元素的数组[0]=“hello”[1]=”{X=4535.12,Y=4535.12}{X=12345,Y=12345}“[2]=“再见”感谢您的帮助,我通过稍微更改此模式成功地实现了这一点,我在末尾添加了
++
,然后创建了自己的捕获组,以便将其全部返回。然后,我将内部组设置为非捕获,以便只获取一次数据-我最终得到了
(?:{X=\d+(?:\.\d+),Y=\d+(?:\.\d+)+)
我会使用
@“{X=[\d.]+,\s+Y=[\d.]+}”
regex。匹配的浮点值的有效性在这里不应该是一个问题。这不是我想要的。很抱歉,如果我没有很好地指定,我希望整个数据集是分开的,所以如果数据像hello,{X=4535.12,Y=4535.12}{X=12345,Y=12345},再见-我想要一个包含三个元素的数组[0]=“hello”[1]=“hello”{X=4535.12,Y=4535.12}{X=12345,Y=12345}”[2]=“再见”感谢您的帮助,我通过稍微更改此模式成功地实现了这一点,我在末尾添加了
++
,然后创建了自己的捕获组,以便将其全部返回。然后,我将内部组设置为非捕获,以便只获取一次数据-我最终得到了
(?:{X=\d+(?:\.\d+),Y=\d+(?:\.\d+)+)
那里没有那么多空格,90%的地方都不需要,可能会简化为^({X=(\d+(\.\d+),\s*Y=(\d+(\.\d+)))$-这也比指定的数据匹配得多。关于表格.5或12中的数字呢?那里没有太多的空格,在90%的地方它是不必要的,可能会简化为^({X=(\d+(\.\d+)),\s*Y=(\d+(\.\d+))$-这也比指定的数据匹配得多。那么表5或表12中的数字呢。?