我需要用冒号替换带小数点的数字。简而言之:
在5.50接我,带我去动物园
在5:50接我,带我去动物园
但是,我不想只用一段时间来替换一个数字:
5点接我。带我去动物园。
5点接我。带我去动物园。
我可以通过蛮力来做到这一点,但我相信正则表达式是最好的解决方案,并且不可避免地因为我不是正则表达式专家,所以我遇到了Zawinski法则。
我可以匹配这个号码,但我仍然坚持如何进行更换。
\d\.\d+
我认为我需要使用前瞻和/或分组,但我不熟悉语法。
我之前发现过Replace dot(.) with comma(,) using RegEx?和Remove decimal point when not between two digits之类的问题,但是第一个问题根本没有使用正则表达式,而第二个看起来很相似,但我无法弄清楚如何改变答案以获得匹配,更不用说如何替换它。
答案 0 :(得分:4)
要继续使用当前的解决方案,您需要确保更换后点的两端数字可以保持不变,但在匹配时仍需要计算(检查)。
有两种方法可以实现这一目标:
这是捕获组的第一种方法:
Regex.Replace(s, @"(\d)\.(\d+)", "$1:$2")
另一个有外观:
Regex.Replace(s, @"(?<=\d)\.(?=\d)", ":")
<强>详情
(\d)
- 第1组(后来在$1
替换反向引用的帮助下引用):任何一个Unicode数字或(?<=\d)
- 一个正面的背后隐藏,需要紧靠当前位置左侧的数字\.
- 一个点(\d+)
- 第2组(后来在$2
替换反向引用的帮助下引用):任何1个或多个Unicode数字或(?=\d)
- 一个积极的前瞻,需要在当前位置右侧有一个数字您可以继续调整它以仅匹配单词边界内的字符串,并在第二个\d
上使用限制量词来匹配仅2位数字:
\b(\d)\.(\d{2})\b
或
(?<=\b\d)\.(?=\d{2}\b)
请参阅another regex demo(和Version 2 regex with lookarounds)。请注意,有时需要进一步调整字边界。
要确保只匹配ASCII数字,请使用RegexOptions.ECMAScript
选项。或者将所有\d
替换为[0-9]
。
答案 1 :(得分:1)
对于24小时格式,您可以使用此正则表达式:
/([0-1]?[0-9]|[2][0-3]).[0-5]?[0-9]/
基本上匹配:
时间:
分:
确保仅在输入有效时间时才执行此操作。它是你最接近的。匹配整个正则表达式,将.
替换为:
并将其放回原位。