C# 对于包含字符和数字的字符串,如何仅向所有数字添加1

C# 对于包含字符和数字的字符串,如何仅向所有数字添加1,c#,path,C#,Path,谢谢你帮助我! 我有一个来自路径文件的字符串列表: Data=“M311.97458250.39993 L213.97533248.39996 222.37435216.7998 C222.37435216.7998……589.5753173.99994 593.1753179.9999……334.3039253.21373311.97458250.39993 z“(该“…”用于表示非必要的数字) 如您所见,字符(如“M”和“C”)有一些特殊的含义,数字对是用于cooridinate的。我想在“

谢谢你帮助我! 我有一个来自路径文件的字符串列表:

Data=“M311.97458250.39993 L213.97533248.39996 222.37435216.7998 C222.37435216.7998……589.5753173.99994 593.1753179.9999……334.3039253.21373311.97458250.39993 z“(该“…”用于表示非必要的数字)

如您所见,字符(如“M”和“C”)有一些特殊的含义,数字对是用于cooridinate的。我想在“数据”中为每个数字添加1,而不改变任何其他内容。如何使用C做到这一点?我想a
.split()
很有用,但“数据”太难了,仅
.split()


谢谢!

您可以使用
Regex
识别字符串中的数字,并用新值替换它们

var data = @"M311.97458,250.39993 L213.97533,248.39996 222.37435,216.7998 C222.37435,216.7998 ......589.5753,173.99994,593.1753,179.9999......334.3039,253.21373 311.97458,250.39993 z";            
var replaced = Regex.Replace(data, "((?=[^, ])\\d+\\.\\d+)", (match) => (double.Parse(match.Value) + 1).ToString());
// output: M312.97458,251.39993 L214.97533,249.39996 223.37435,217.7998 C223.37435,217.7998 ......590.5753,174.99994,594.1753,180.9999......335.3039,254.21373 312.97458,251.39993 z

因此,这里的
Regex
模式通过查找任何不是逗号或空格且带有小数点的数字来识别字符串中的数字(因此它不适用于整数,但如果需要,可以进行调整)。然后有效地在
Regex.Replace
中,我们循环遍历每个匹配项,并使用a向数字中添加一个,然后返回它以形成新字符串。

您可以使用
Regex
识别字符串中的数字,并用新值替换它们。例如

var data = @"M311.97458,250.39993 L213.97533,248.39996 222.37435,216.7998 C222.37435,216.7998 ......589.5753,173.99994,593.1753,179.9999......334.3039,253.21373 311.97458,250.39993 z";            
var replaced = Regex.Replace(data, "((?=[^, ])\\d+\\.\\d+)", (match) => (double.Parse(match.Value) + 1).ToString());
// output: M312.97458,251.39993 L214.97533,249.39996 223.37435,217.7998 C223.37435,217.7998 ......590.5753,174.99994,594.1753,180.9999......335.3039,254.21373 312.97458,251.39993 z

因此,这里的
Regex
模式通过查找任何不是逗号或空格且带有小数点的数字来识别字符串中的数字(因此它不适用于整数,但如果需要,可以进行调整)。然后有效地在
正则表达式中。Replace
我们循环遍历每个匹配项,并使用a将一个添加到数字中,并返回它以形成新字符串。

添加1表示串联。即
“123”
变为
“1231”
或将
1
添加到子字符串表示的数字中,如
“123”所示“
变成了
“124”
?那是SVG吗?你好!我是说123到124。对不起,我没有描述清楚。是的,它是一个SVG,您可以在不改变其清晰度的情况下更改其形状的大小。添加1表示串联。i、 e.
“123”
变为
“1231”
,或者将
1
添加到子字符串所表示的数字中,如
“123”
变为
“124”
?这是SVG吗?您好!我是说123到124。对不起,我没有描述清楚。是的,这是一个SVG,你可以改变它的形状大小而不改变它的清晰度。嗨,史蒂夫!你的代码太棒了!我写了另一段代码,这段代码很长而且不成功,但是你只需要一行代码就可以完成它!我还有一个问题,你能不能在每个匹配的元素中只添加1个?例如,在所有(x,y)匹配中,我只向每个x添加1,而不是y.:)您可以做一些粗制滥造的事情,但从您最近的评论来看,这是SVG,您确实需要正确地解析它。。不是每个命令都有x和y,所以使用这种方法会变得混乱。我会留下我的答案,因为我认为它确实适用于最初提出的问题。嗨,史蒂夫!谢谢你的建议!这个SVG由我画的很多点组成,所以我认为每个点匹配都有x和y。我从未学习过正则表达式,但正如您的代码所示,它确实非常有效。你能帮我修改一下你的代码吗?这样我只能在x或y上加1?改变SVD.data对我来说是一个非常重要的功能,因为我想不断地改变SVD.data,使SVD按照我的命令移动到某个方向。我确实试过你的代码,但它说输出不符合“dataproperty”。我现在正试图解决这个问题。它很脏,但是你可以将正则表达式模式(我已经添加了反斜杠转义)更改为
((?=[^,])\\d+\\.\\d+,
,它将以任何紧跟其后的逗号为目标,而忽略其他数字
replaced=Regex.Replace(数据,((?=[^,])\\d+\.\\d+,(匹配)=>(double.Parse(match.Groups[1].Value)+1.ToString()+,)((?=[^,])\\d+\\.\\d+,
,它将以任何紧跟其后的逗号为目标,而忽略其他数字
replaced=Regex.Replace(数据,((?=[^,])\\d+\.\\d+,(匹配)=>(double.Parse(match.Groups[1].Value)+1.ToString()+,)