【问题标题】:For a string containing characters and numbers, how to add 1 to all numbers only对于包含字符和数字的字符串,如何只给所有数字加1
【发布时间】:2019-04-14 12:45:04
【问题描述】:

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

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”(“......”用于表示多余的数字”)

如您所见,字符(如“M”和“C”)有一些特殊含义,数字对用于坐标。我想在“数据”中的每个数字上加 1,而不更改任何其他内容。我怎么能用 C# 做到这一点?我猜.split() 很有用,但“数据”对于 .split() 来说太难了

谢谢!

【问题讨论】:

  • 加 1 表示连接。即"123" 变为"1231" 或将1 添加到"123" 中的子字符串表示的数字变为"124"
  • 那是SVG吗?
  • 嗨,粘!我的意思是 123 到 124。对不起,我没有清楚地描述它。是的,它是一个 SVG,您可以在不改变其清晰度的情况下更改其形状的大小。

标签: c# path


【解决方案1】:

您可以使用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 中有效地循环每个匹配项,并使用MatchEvaluator 将数字加一并返回以形成新字符串。

【讨论】:

  • 嗨史蒂夫!你的代码太棒了!我又写了一段代码,太长了,不成功,但你一行代码就写完了!我还有一个问题,你能不能只在每场比赛的选定元素上加 1?例如,我只在所有 (x,y) 匹配中的每个 x 上加 1,而不是 y。 :)
  • 你可以做一些粗略的事情,但从你最新的评论来看,这是 SVG,你真的需要正确解析它.. 不是每个命令都有 x 和 y,所以它会变得混乱使用这种方法。我会留下我的答案,因为我认为它确实适用于最初陈述的问题。
  • 嗨史蒂夫!谢谢你的建议!这个 SVG 由我绘制的很多点组成,所以我认为每个点匹配都有 x 和 y。我从未学过正则表达式,但事实证明它非常有效,如您的代码所示。你能帮我修改一下你的代码,这样我只能在 x 或 y 上加 1 吗?更改 SVD.data 对我来说是一个非常重要的功能,因为我想不断更改 SVD.data 以使 SVD 按照我的命令移动到某个方向。我确实尝试了您的代码,但它说输出不适合“数据属性”。我正在努力解决它。
  • 它很脏,但你可以将正则表达式模式(我已经添加了反斜杠转义)更改为((?=[^, ])\\d+\\.\\d+),,它将针对紧跟在它后面的逗号的任何数字并忽略其他数字.
  • replaced = Regex.Replace(data, "((?=[^, ])\\d+\\.\\d+),", (match) => (double.Parse(match.Groups[1].Value) + 1).ToString()+",");
猜你喜欢
  • 2022-07-22
  • 2020-02-19
  • 2015-05-28
  • 2011-11-30
  • 1970-01-01
  • 2019-06-11
  • 2014-09-10
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多